Mr.doob 1 년 전
부모
커밋
4bba481ffc
100개의 변경된 파일2552개의 추가작업 그리고 1535개의 파일을 삭제
  1. 402 282
      build/three.cjs
  2. 402 282
      build/three.module.js
  3. 0 0
      build/three.module.min.js
  4. 347 239
      build/three.webgpu.js
  5. 0 0
      build/three.webgpu.min.js
  6. 347 239
      build/three.webgpu.nodes.js
  7. 0 0
      build/three.webgpu.nodes.min.js
  8. 1 1
      docs/api/ar/loaders/ImageLoader.html
  9. 6 1
      docs/api/en/core/BufferGeometry.html
  10. 4 4
      docs/api/en/core/Object3D.html
  11. 1 1
      docs/api/en/loaders/ImageBitmapLoader.html
  12. 1 1
      docs/api/en/loaders/ImageLoader.html
  13. 51 17
      docs/api/en/math/Color.html
  14. 3 0
      docs/api/en/math/Vector4.html
  15. 37 1
      docs/api/en/objects/BatchedMesh.html
  16. 5 15
      docs/api/en/renderers/WebGLRenderer.html
  17. 10 10
      docs/api/fr/animation/AnimationAction.html
  18. 1 1
      docs/api/fr/animation/AnimationClip.html
  19. 1 1
      docs/api/fr/animation/AnimationMixer.html
  20. 1 1
      docs/api/fr/animation/AnimationUtils.html
  21. 6 6
      docs/api/fr/animation/KeyframeTrack.html
  22. 1 1
      docs/api/fr/animation/tracks/BooleanKeyframeTrack.html
  23. 1 1
      docs/api/fr/animation/tracks/ColorKeyframeTrack.html
  24. 1 1
      docs/api/fr/animation/tracks/NumberKeyframeTrack.html
  25. 1 1
      docs/api/fr/animation/tracks/QuaternionKeyframeTrack.html
  26. 1 1
      docs/api/fr/animation/tracks/StringKeyframeTrack.html
  27. 1 1
      docs/api/fr/animation/tracks/VectorKeyframeTrack.html
  28. 2 2
      docs/api/fr/audio/AudioAnalyser.html
  29. 1 1
      docs/api/fr/cameras/ArrayCamera.html
  30. 2 2
      docs/api/fr/cameras/Camera.html
  31. 1 1
      docs/api/fr/cameras/CubeCamera.html
  32. 2 2
      docs/api/fr/cameras/OrthographicCamera.html
  33. 6 6
      docs/api/fr/cameras/PerspectiveCamera.html
  34. 1 1
      docs/api/fr/constants/CustomBlendingEquations.html
  35. 12 12
      docs/api/fr/constants/Textures.html
  36. 2 2
      docs/api/fr/geometries/BoxGeometry.html
  37. 1 1
      docs/api/fr/geometries/CapsuleGeometry.html
  38. 4 4
      docs/api/fr/materials/LineBasicMaterial.html
  39. 1 1
      docs/api/fr/materials/LineDashedMaterial.html
  40. 6 6
      docs/api/fr/materials/Material.html
  41. 5 5
      docs/api/fr/materials/MeshBasicMaterial.html
  42. 4 4
      docs/api/fr/materials/MeshDepthMaterial.html
  43. 3 3
      docs/api/fr/materials/MeshDistanceMaterial.html
  44. 5 5
      docs/api/fr/materials/MeshLambertMaterial.html
  45. 3 3
      docs/api/fr/materials/MeshMatcapMaterial.html
  46. 2 2
      docs/api/fr/materials/MeshNormalMaterial.html
  47. 6 6
      docs/api/fr/materials/MeshPhongMaterial.html
  48. 5 5
      docs/api/fr/materials/MeshStandardMaterial.html
  49. 5 5
      docs/api/fr/materials/MeshToonMaterial.html
  50. 4 4
      docs/api/fr/materials/PointsMaterial.html
  51. 1 1
      docs/api/fr/materials/RawShaderMaterial.html
  52. 3 3
      docs/api/fr/materials/ShaderMaterial.html
  53. 1 1
      docs/api/fr/materials/ShadowMaterial.html
  54. 4 4
      docs/api/fr/materials/SpriteMaterial.html
  55. 1 1
      docs/api/it/loaders/ImageBitmapLoader.html
  56. 1 1
      docs/api/it/loaders/ImageLoader.html
  57. 1 1
      docs/api/ko/core/Object3D.html
  58. 3 3
      docs/api/zh/core/Layers.html
  59. 1 1
      docs/api/zh/loaders/ImageBitmapLoader.html
  60. 1 1
      docs/api/zh/loaders/ImageLoader.html
  61. 1 1
      docs/api/zh/materials/LineDashedMaterial.html
  62. 3 5
      docs/api/zh/materials/Material.html
  63. 5 2
      docs/api/zh/materials/MeshBasicMaterial.html
  64. 3 0
      docs/api/zh/materials/MeshDepthMaterial.html
  65. 4 1
      docs/api/zh/materials/MeshDistanceMaterial.html
  66. 11 7
      docs/api/zh/materials/MeshLambertMaterial.html
  67. 1 1
      docs/api/zh/materials/MeshMatcapMaterial.html
  68. 3 2
      docs/api/zh/materials/MeshNormalMaterial.html
  69. 8 3
      docs/api/zh/materials/MeshPhongMaterial.html
  70. 67 11
      docs/api/zh/materials/MeshPhysicalMaterial.html
  71. 8 11
      docs/api/zh/materials/MeshStandardMaterial.html
  72. 1 1
      docs/api/zh/materials/MeshToonMaterial.html
  73. 3 1
      docs/api/zh/materials/PointsMaterial.html
  74. 4 4
      docs/api/zh/materials/ShaderMaterial.html
  75. 1 1
      docs/api/zh/materials/ShadowMaterial.html
  76. 2 2
      docs/api/zh/materials/SpriteMaterial.html
  77. 22 2
      docs/api/zh/scenes/Scene.html
  78. 2 2
      docs/examples/en/animations/MMDAnimationHelper.html
  79. 1 1
      docs/examples/en/controls/ArcballControls.html
  80. 30 0
      docs/examples/en/controls/TransformControls.html
  81. 1 1
      docs/examples/en/exporters/DRACOExporter.html
  82. 2 2
      docs/examples/en/geometries/TeapotGeometry.html
  83. 2 2
      docs/examples/en/math/convexhull/ConvexHull.html
  84. 4 0
      docs/manual/en/introduction/Color-management.html
  85. 2 2
      docs/manual/en/introduction/How-to-update-things.html
  86. 4 4
      docs/manual/ja/introduction/How-to-use-post-processing.html
  87. 3 3
      docs/manual/ko/introduction/How-to-dispose-of-objects.html
  88. 36 0
      docs/page.css
  89. 34 2
      docs/page.js
  90. 64 28
      docs/prettify/prettify.js
  91. 13 2
      examples/files.json
  92. 3 3
      examples/jsm/Addons.js
  93. 2 0
      examples/jsm/animation/MMDAnimationHelper.js
  94. 2 0
      examples/jsm/animation/MMDPhysics.js
  95. 0 208
      examples/jsm/cameras/CinematicCamera.js
  96. 22 6
      examples/jsm/controls/TransformControls.js
  97. 2 2
      examples/jsm/csm/CSM.js
  98. 7 4
      examples/jsm/csm/CSMFrustum.js
  99. 2 0
      examples/jsm/csm/CSMHelper.js
  100. 435 0
      examples/jsm/csm/CSMShadowNode.js

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 402 - 282
build/three.cjs


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 402 - 282
build/three.module.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
build/three.module.min.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 347 - 239
build/three.webgpu.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
build/three.webgpu.min.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 347 - 239
build/three.webgpu.nodes.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
build/three.webgpu.nodes.min.js


+ 1 - 1
docs/api/ar/loaders/ImageLoader.html

@@ -25,7 +25,7 @@
 		// load a image resource
 		loader.load(
 			// resource URL
-			'textures/skyboxsun25degtest.png',
+			'image.png',
 	
 			// onLoad callback
 			function ( image ) {

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

@@ -335,7 +335,12 @@
 		</p>
 
 		<h3>[method:this setFromPoints] ( [param:Array points] )</h3>
-		<p>Sets the attributes for this BufferGeometry from an array of points.</p>
+		<p>
+			Defines a geometry by creating a `position` attribute based on the given array of points. The array can hold 
+			instances of [page:Vector2] or [page:Vector3]. When using two-dimensional data, the `z` coordinate for all vertices is set to `0`.<br />
+			If the method is used with an existing `position` attribute, the vertex data are overwritten with the data from the array. The length of the 
+			array must match the vertex count.
+		</p>
 
 		<h3>[method:this setIndex] ( [param:BufferAttribute index] )</h3>
 		<p>Set the [page:.index] buffer.</p>

+ 4 - 4
docs/api/en/core/Object3D.html

@@ -275,8 +275,8 @@
 
 		<h3>[property:Boolean DEFAULT_MATRIX_WORLD_AUTO_UPDATE]</h3>
 		<p>
-			The default setting for [page:.matrixWorldAutoUpdate
-			matrixWorldAutoUpdate] for newly created Object3Ds.<br />
+			The default setting for [page:.matrixWorldAutoUpdate matrixWorldAutoUpdate]
+			for newly created Object3Ds.<br />
 		</p>
 
 		<h2>Methods</h2>
@@ -311,7 +311,7 @@
 			Note: This method does not support scene graphs having
 			non-uniformly-scaled nodes(s).
 		</p>
-		
+
 		<h3>[method:this clear]()</h3>
 		<p>Removes all child objects.</p>
 
@@ -325,7 +325,7 @@
 
 		<h3>[method:this copy]( [param:Object3D object], [param:Boolean recursive] )</h3>
 		<p>
-			recursive -- If set to `true`, descendants of the object are copied next to the existing ones. 
+			recursive -- If set to `true`, descendants of the object are copied next to the existing ones.
 			If set to `false`, descendants are left unchanged. Default is `true`.<br /><br />
 
 			Copies the given object into this object. Note: Event listeners and

+ 1 - 1
docs/api/en/loaders/ImageBitmapLoader.html

@@ -41,7 +41,7 @@
 		// load a image resource
 		loader.load(
 			// resource URL
-			'textures/skyboxsun25degtest.png',
+			'image.png',
 
 			// onLoad callback
 			function ( imageBitmap ) {

+ 1 - 1
docs/api/en/loaders/ImageLoader.html

@@ -25,7 +25,7 @@
 		// load a image resource
 		loader.load(
 			// resource URL
-			'textures/skyboxsun25degtest.png',
+			'image.png',
 
 			// onLoad callback
 			function ( image ) {

+ 51 - 17
docs/api/en/math/Color.html

@@ -12,7 +12,41 @@
 		<p class="desc">Class representing a color.</p>
 
 		<p>
-			Iterating through a [name] instance will yield its components (r, g, b) in
+			A Color instance is represented by RGB components in the linear <i>working
+			color space</i>, which defaults to `LinearSRGBColorSpace`. Inputs
+			conventionally using `SRGBColorSpace` (such as hexadecimals and CSS
+			strings) are converted to the working color space automatically.
+		</p>
+
+		<p>
+			<code>
+// converted automatically from SRGBColorSpace to LinearSRGBColorSpace
+const color = new THREE.Color().setHex( 0x112233 );
+			</code>
+		</p>
+
+		<p>
+			Source color spaces may be specified explicitly, to ensure correct
+			conversions.
+		</p>
+
+		<p>
+			<code>
+// assumed already LinearSRGBColorSpace; no conversion
+const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );
+
+// converted explicitly from SRGBColorSpace to LinearSRGBColorSpace
+const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );
+			</code>
+		</p>
+
+		<p>
+			If THREE.ColorManagement is disabled, no conversions occur. For details,
+			see <i>Color management</i>.
+		</p>
+
+		<p>
+			Iterating through a Color instance will yield its components (r, g, b) in
 			the corresponding order.
 		</p>
 
@@ -50,7 +84,7 @@ const color7 = new THREE.Color( 1, 0, 0 );
 			[page:Color_Hex_or_String r] - (optional) If arguments [page:Float g] and
 			[page:Float b] are defined, the red component of the color. If they are
 			not defined, it can be a
-			[link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet] (recommended), 
+			[link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet] (recommended),
 			a CSS-style string, or another `Color` instance.<br />
 			[page:Float g] - (optional) If it is defined, the green component of the
 			color.<br />
@@ -58,7 +92,7 @@ const color7 = new THREE.Color( 1, 0, 0 );
 			color.<br /><br />
 
 			Note that standard method of specifying color in three.js is with a
-			[link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet], 
+			[link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet],
 			and that method is used throughout the rest of the
 			documentation.<br /><br />
 
@@ -91,13 +125,13 @@ const color7 = new THREE.Color( 1, 0, 0 );
 		<p>Read-only flag to check if a given object is of type [name].</p>
 
 		<h3>[property:Float r]</h3>
-		<p>Red channel value between `0` and `1`. Default is `1`.</p>
+		<p>Red channel value between `0.0` and `1.0`. Default is `1`.</p>
 
 		<h3>[property:Float g]</h3>
-		<p>Green channel value between `0` and `1`. Default is `1`.</p>
+		<p>Green channel value between `0.0` and `1.0`. Default is `1`.</p>
 
 		<h3>[property:Float b]</h3>
-		<p>Blue channel value between `0` and `1`. Default is `1`.</p>
+		<p>Blue channel value between `0.0` and `1.0`. Default is `1`.</p>
 
 		<h2>Methods</h2>
 
@@ -134,17 +168,17 @@ const color7 = new THREE.Color( 1, 0, 0 );
 		</p>
 
 		<h3>[method:this convertLinearToSRGB]()</h3>
-		<p>Converts this color from linear space to sRGB space.</p>
+		<p>Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.</p>
 
 		<h3>[method:this convertSRGBToLinear]()</h3>
-		<p>Converts this color from sRGB space to linear space.</p>
+		<p>Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.</p>
 
 		<h3>[method:this copyLinearToSRGB]( [param:Color color] )</h3>
 		<p>
 			[page:Color color] — Color to copy.<br />
 
 			Copies the given color into this color, and then converts this color from
-			linear space to sRGB space.
+			`LinearSRGBColorSpace` to `SRGBColorSpace`.
 		</p>
 
 		<h3>[method:this copySRGBToLinear]( [param:Color color] )</h3>
@@ -152,7 +186,7 @@ const color7 = new THREE.Color( 1, 0, 0 );
 			[page:Color color] — Color to copy.<br />
 
 			Copies the given color into this color, and then converts this color from
-			sRGB space to linear space.
+			`SRGBColorSpace` to `LinearSRGBColorSpace`.
 		</p>
 
 		<h3>[method:Boolean equals]( [param:Color color] )</h3>
@@ -208,11 +242,11 @@ const color7 = new THREE.Color( 1, 0, 0 );
 			object of the form:
 
 			<code>
-			{ 
-				h: 0, 
-				s: 0, 
-				l: 0 
-			} 
+			{
+				h: 0,
+				s: 0,
+				l: 0
+			}
 			</code>
 		</p>
 
@@ -253,9 +287,9 @@ const color7 = new THREE.Color( 1, 0, 0 );
 			[page:Float alpha] - interpolation factor, typically in the closed
 			interval `[0, 1]`.<br /><br />
 
-			Sets this color to be the color linearly interpolated between [page:Color color1] 
+			Sets this color to be the color linearly interpolated between [page:Color color1]
 			and [page:Color color2] where alpha is the percent distance along
-			the line connecting the two colors - alpha = 0 will be [page:Color color1], 
+			the line connecting the two colors - alpha = 0 will be [page:Color color1],
 			and alpha = 1 will be [page:Color color2].
 		</p>
 

+ 3 - 0
docs/api/en/math/Vector4.html

@@ -157,6 +157,9 @@
 			[page:.z z] and [page:.w w] properties to this Vector4.
 		</p>
 
+		<h3>[method:this divide]( [param:Vector4 v] )</h3>
+		<p>Divides this vector by [page:Vector4 v].</p>
+
 		<h3>[method:this divideScalar]( [param:Float s] )</h3>
 		<p>Divides this vector by scalar [page:Float s].</p>
 

+ 37 - 1
docs/api/en/objects/BatchedMesh.html

@@ -260,7 +260,13 @@
 		<p>
 			Adds the given geometry to the [name] and returns the associated geometry id referring to it to be used in other functions.
 		</p>
-
+		<h3>
+			[method:Integer deleteGeometry]( [param:Integer geometryId] )
+		</h3>
+		<p>
+			[page:Integer geometryId]: The id of a geometry to remove from the [name] that was previously added via "addGeometry". Any instances referencing
+			this geometry will also be removed as a side effect.
+		</p>
 		<h3>
 			[method:Integer addInstance]( [param:Integer geometryId] )
 		</h3>
@@ -295,6 +301,36 @@
 			Calling this will change all instances that are rendering that geometry.
 		</p>
 
+		<h3>
+			[method:this optimize]()
+		</h3>
+		<p>
+			Repacks the sub geometries in [name] to remove any unused space remaining from previously deleted geometry, freeing up space to add new geometry.
+		</p>
+
+		<h3>
+			[method:this setGeometrySize]( maxVertexCount, maxIndexCount )
+		</h3>
+		<p>
+			Resizes the available space in [name]'s vertex and index buffer attributes to the provided sizes. If the provided arguments shrink the geometry buffers
+			but there is not enough unused space at the end of the geometry attributes then an error is thrown. 
+		</p>
+		<p>
+			[page:Integer maxVertexCount] - the max number of vertices to be used by all unique geometries to resize to.<br />
+			[page:Integer maxIndexCount] - the max number of indices to be used by all unique geometries to resize to.<br />
+		</p>
+
+		<h3>
+			[method:this setInstanceCount]( maxInstanceCount )
+		</h3>
+		<p>
+			Resizes the necessary buffers to support the provided number of instances. If the provided arguments shrink the number of instances but there are not enough
+			unused ids at the end of the list then an error is thrown.
+		</p>
+		<p>
+			[page:Integer maxInstanceCount] - the max number of individual instances that can be added and rendered by the [name].<br />
+		</p>
+
 		<!--
 		<h3>
 			[method:Integer getInstanceCountAt]( [param:Integer index] )

+ 5 - 15
docs/api/en/renderers/WebGLRenderer.html

@@ -380,23 +380,13 @@ document.body.appendChild( renderer.domElement );
 		</p>
 
 		<h3>
-			[method:undefined copyTextureToTexture]( [param:Texture srcTexture], [param:Texture dstTexture], [param:Box2 srcRegion], [param:Vector2 dstPosition], [param:Number level] )
+			[method:undefined copyTextureToTexture]( [param:Texture srcTexture], [param:Texture dstTexture], [param:Box2 srcRegion] | [param:Box3 srcRegion], [param:Vector2 dstPosition] | [param:Vector3 dstPosition], [param:Number dstLevel] )
 		</h3>
 		<p>
-			Copies the pixels of a texture in the bounds '[page:Box2 srcRegion]' in
-			the destination texture starting from the given position. Enables access
-			to
-			[link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texSubImage2D WebGLRenderingContext.texSubImage2D].
-		</p>
-
-		<h3>
-			[method:undefined copyTextureToTexture3D]( [param:Texture srcTexture], [param:Texture dstTexture], [param:Box3 srcRegion], [param:Vector3 dstPosition], [param:Number level] )
-		</h3>
-		<p>
-			Copies the pixels of a texture in the bounds '[page:Box3 srcRegion]' in
-			the destination texture starting from the given position. Enables access
-			to
-			[link:https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/texSubImage3D WebGL2RenderingContext.texSubImage3D].
+			Copies the pixels of a texture in the bounds '[page:Box3 srcRegion]' in the destination texture starting from the given position.
+			2D Texture, 3D Textures, or a mix of the two can be used as source and destination texture arguments for copying between layers of 3d textures.</br> 
+			The `depthTexture` and `texture` property of render targets are supported as well.<br />
+			When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized e.g. via [page:.initRenderTarget]().
 		</p>
 
 		<h3>[method:undefined dispose]( )</h3>

+ 10 - 10
docs/api/fr/animation/AnimationAction.html

@@ -29,7 +29,7 @@
             [page:AnimationClip clip] - l`AnimationClip` qui contient les données d'animation pour cette action.<br />
             [page:Object3D localRoot] - l'objet racine sur lequel est appliqué l'action.<br /><br />
 
-            Note: Au lieu d'appeler ce constructeur directement, vous devriez instantier un AnimationAction avec
+            Note: Au lieu d'appeler ce constructeur directement, vous devriez instancier un AnimationAction avec
             [page:AnimationMixer.clipAction] étant donné que cette méthode applique une mise en cache pour obtenir de meilleures performances.
         </p>
 
@@ -42,7 +42,7 @@
             Si `clampWhenFinished` est mis à true l'animation sera automatiquement [page:.paused mise en pause]
             à son dernier frame.<br /><br />
 
-            Si `clampWhenFinished` est mis à false, [page:.enabled enabled] sera automatiquement reglé sur
+            Si `clampWhenFinished` est mis à false, [page:.enabled enabled] sera automatiquement réglé sur
             false quand la dernière boucle de l'action sera terminée, afin que cette action n'ai pas plus
             d'impact.<br /><br />
 
@@ -68,14 +68,14 @@
 
         <h3>[property:Number loop]</h3>
         <p>
-            Le mode répeter (peut-être changé avec [page:.setLoop setLoop]). Sa valeur par défaut est
+            Le mode répéter (peut-être changé avec [page:.setLoop setLoop]). Sa valeur par défaut est
             [page:Animation THREE.LoopRepeat] (avec un nombre infini de répétitions [page:.repetitions repetitions])<br /><br />
 
             Doit être une de ces constantes:<br /><br />
             [page:Animation THREE.LoopOnce] - joue le clip une fois,<br />
-            [page:Animation THREE.LoopRepeat] - joue le clip le nombre choisi de `répetitions`,
+            [page:Animation THREE.LoopRepeat] - joue le clip le nombre choisi de `répétitions`,
             en sautant à chaque fois de la fin du clip à son début,<br />
-            [page:Animation THREE.LoopPingPong] - joue le clip le nombre choisi de `répetitions`,
+            [page:Animation THREE.LoopPingPong] - joue le clip le nombre choisi de `répétitions`,
             alternant entre lecture du début vers la fin et lecture de la fin vers le début.
         </p>
 
@@ -223,13 +223,13 @@
 			([page:.startAt startAt]).<br /><br />
 
 			Note: le fait que `isRunning` soit à true n'indique pas nécessairement que l'action est visible.
-			C'est seulement le cas si le [page:.weight weight] est reglé sur une valeur non-nulle.
+			C'est seulement le cas si le [page:.weight weight] est réglé sur une valeur non-nulle.
 		</p>
 
 		<h3>[method:Boolean isScheduled]()</h3>
 		<p>
 			Renvoie true, si cette action est activée dans le mixer.<br /><br />
-			Note: Cela n'indique pas nécessairement que l'action est en cours d'éxécution (voir les conditions additionnelles
+			Note: Cela n'indique pas nécessairement que l'action est en cours d'éxecution (voir les conditions additionnelles
 			pour [page:.isRunning isRunning]).
 		</p>
 
@@ -240,7 +240,7 @@
 			Note: Activer cette action ne signifie pas nécessairement que l'animation démarrera directement:
 			Si l'action s'était déjà terminée avant (en atteignant la fin de sa dernière boucle), ou si une durée
 			pour un départ différé a été renseignée (via [page:.startAt startAt]), un [page:.reset reset] doit être
-			éxécuté avant. Quelques autres paramètres ([page:.paused paused]=true, [page:.enabled enabled]=false,
+			exécuté avant. Quelques autres paramètres ([page:.paused paused]=true, [page:.enabled enabled]=false,
 			[page:.weight weight]=0, [page:.timeScale timeScale]=0) peuvent empêcher cette animation d'être jouée,
 			également.
 		</p>
@@ -267,7 +267,7 @@
 		<p>
 			Renseigne le [page:.timeScale timeScale] et stoppe tous les warpings programmés. Cette méthode peut être chaînée.<br /><br />
 
-			Si [page:.paused paused] est à false, l'échelle temporelle effective (propriété interne) sera également 
+			Si [page:.paused paused] est à false, l'échelle temporelle effective (propriété interne) sera également
 			mise à cette valeur; par ailleurs l'échelle temporelle effective (affectant directement l'animation à
 			cet instant) sera mis à `0`.<br /><br />
 
@@ -332,7 +332,7 @@
 			La synchronisation est faite en dupliquant les valeurs du [page:.time time] et du [page:.timeScale timeScale] de l'autre action
 			(stoppant tous les warpings programmés).<br /><br />
 
-			Note: Les changements futurs du `time` et du `timeScale` de l'autre action ne seront pas détéctés.
+			Note: Les changements futurs du `time` et du `timeScale` de l'autre action ne seront pas détectés.
 		</p>
 
 		<h3>[method:this warp]( [param:Number startTimeScale], [param:Number endTimeScale], [param:Number durationInSeconds] )</h3>

+ 1 - 1
docs/api/fr/animation/AnimationClip.html

@@ -84,7 +84,7 @@
 
 		<h3>[method:Object toJSON]()</h3>
 		<p>
-			Renvoie un objet JSON représentant le clip d'animation serialisé.
+			Renvoie un objet JSON représentant le clip d'animation sérialisé.
 		</p>
 
 		<h3>[method:this trim]()</h3>

+ 1 - 1
docs/api/fr/animation/AnimationMixer.html

@@ -74,7 +74,7 @@
 
 		<h3>[method:this stopAllAction]()</h3>
 		<p>
-			Désactive toutes les actions précedemment programmées pour ce mixer.
+			Désactive toutes les actions précédemment programmées pour ce mixer.
 		</p>
 
 		<h3>[method:this update]([param:Number deltaTimeInSeconds]) </h3>

+ 1 - 1
docs/api/fr/animation/AnimationUtils.html

@@ -44,7 +44,7 @@
 
 		<h3>[method:Array sortedArray]( values, stride, order )</h3>
 		<p>
-		Trie le tableau précedemment renvoyé par [page:AnimationUtils.getKeyframeOrder getKeyframeOrder].
+		Trie le tableau précédemment renvoyé par [page:AnimationUtils.getKeyframeOrder getKeyframeOrder].
 		</p>
 
 		<h3>[method:AnimationClip subclip]( [param:AnimationClip clip], [param:String name], [param:Number startFrame], [param:Number endFrame], [param:Number fps] )</h3>

+ 6 - 6
docs/api/fr/animation/KeyframeTrack.html

@@ -29,7 +29,7 @@
 		</p>
 
 		<p>
-			A la place, il y a toujours deux tableaux dans un `KeyframeTrack`: le tableau [page:.times times] 
+			A la place, il y a toujours deux tableaux dans un `KeyframeTrack`: le tableau [page:.times times]
 			stocke les durées pour chaque keyframes de ce track dans un ordre séquentiel, et le tableau
 			[page:.values values] array contient les valeurs modifiées correspondantes de la propriété animée.
 		</p>
@@ -96,7 +96,7 @@
 		</p>
 
 		<p>
-			Le nom peut spécifier le noeud en utilisant son nom ou son uuid (bien qu'il doive être dans le 
+			Le nom peut spécifier le noeud en utilisant son nom ou son uuid (bien qu'il doive être dans le
 			sous-arbre du noeud du graphe de scène passé dans le mixer). Ou, si le nom du track commence par un point,
 			le track s'applique au noeud racine qui a été passé en paramètre du mixer.
 		</p>
@@ -119,7 +119,7 @@
 
 		<p>
 			Note: Le nom de track ne doit pas nécessairement être unique. Plusieurs tracks peuvent gérer la même
-			propriété. Le résultat doit être basé sur un mélange pondéré entre les mutiples tracks selon
+			propriété. Le résultat doit être basé sur un mélange pondéré entre les multiples tracks selon
 			le poids de leurs actions respectives.
 		</p>
 
@@ -205,7 +205,7 @@
 
 		<h3>[method:this optimize]()</h3>
 		<p>
-			Retire les clés séquentielles équivalentse, qui sont communes dans les séquences de morph target.
+			Retire les clés séquentielles équivalentes, qui sont communes dans les séquences de morph target.
 		</p>
 
 		<h3>[method:this scale]()</h3>
@@ -240,8 +240,8 @@
 		</p>
 
 		<p>
-			Cette méthode envoie des erreurs à la console, si un track est vide, si la [page:.valueSize value taille] n'est pas valide, si un élémént
-			dans le tableau [page:.times times] ou [page:.values values] n'est pas un nombre valide ou si les éléménts du tableau `times` sont désorganisés.
+			Cette méthode envoie des erreurs à la console, si un track est vide, si la [page:.valueSize value taille] n'est pas valide, si un élément
+			dans le tableau [page:.times times] ou [page:.values values] n'est pas un nombre valide ou si les éléments du tableau `times` sont désorganisés.
 		</p>
 
 		<h2>Méthodes Statiques</h2>

+ 1 - 1
docs/api/fr/animation/tracks/BooleanKeyframeTrack.html

@@ -22,7 +22,7 @@
 
 		<h3>[name]( [param:String name], [param:Array times], [param:Array values] )</h3>
 		<p>
-			[page:String name] - (requis) indentifiant du KeyframeTrack.<br />
+			[page:String name] - (requis) identifiant du KeyframeTrack.<br />
 			[page:Array times] - (requis) tableau de durée des keyframes.<br />
 			[page:Array values] - valeurs des keyframes aux temps spécifiés.<br />
 		</p>

+ 1 - 1
docs/api/fr/animation/tracks/ColorKeyframeTrack.html

@@ -24,7 +24,7 @@
 
 		<h3>[name]( [param:String name], [param:Array times], [param:Array values] )</h3>
 		<p>
-			[page:String name] - (requis) indentifiant du KeyframeTrack.<br />
+			[page:String name] - (requis) identifiant du KeyframeTrack.<br />
 			[page:Array times] - (requis) tableau de durée des keyframes.<br />
 			[page:Array values] - valeurs des keyframes aux temps spécifiés, un tableau à une dimension de composants de couleur entre 0 et 1.<br />
 			[page:Constant interpolation] - le type d'interpolation à utiliser. Voir

+ 1 - 1
docs/api/fr/animation/tracks/NumberKeyframeTrack.html

@@ -22,7 +22,7 @@
 
 		<h3>[name]( [param:String name], [param:Array times], [param:Array values] )</h3>
 		<p>
-			[page:String name] - (requis) indentifiant du KeyframeTrack.<br />
+			[page:String name] - (requis) identifiant du KeyframeTrack.<br />
 			[page:Array times] - (requis) tableau de durée des keyframes.<br />
 			[page:Array values] - valeurs des keyframes aux temps spécifiés.<br />
 			[page:Constant interpolation] - le type d'interpolation à utiliser. Voir

+ 1 - 1
docs/api/fr/animation/tracks/QuaternionKeyframeTrack.html

@@ -22,7 +22,7 @@
 
 		<h3>[name]( [param:String name], [param:Array times], [param:Array values] )</h3>
 		<p>
-			[page:String name] - (requis) indentifiant du KeyframeTrack.<br />
+			[page:String name] - (requis) identifiant du KeyframeTrack.<br />
 			[page:Array times] - (requis) tableau de durée des keyframes.<br />
 			[page:Array values] - valeurs des keyframes aux temps spécifiés, un tableau à une dimension de composants quaternaires.<br />
 			[page:Constant interpolation] - le type d'interpolation à utiliser. Voir

+ 1 - 1
docs/api/fr/animation/tracks/StringKeyframeTrack.html

@@ -22,7 +22,7 @@
 
 		<h3>[name]( [param:String name], [param:Array times], [param:Array values] )</h3>
 		<p>
-			[page:String name] - (requis) indentifiant du KeyframeTrack.<br />
+			[page:String name] - (requis) identifiant du KeyframeTrack.<br />
 			[page:Array times] - (requis) tableau de durée de keyframes.<br />
 			[page:Array values] - valeurs des keyframes aux temps spécifiés.<br />
 			[page:Constant interpolation] - le type d'interpolation à utiliser. Voir

+ 1 - 1
docs/api/fr/animation/tracks/VectorKeyframeTrack.html

@@ -22,7 +22,7 @@
 
 		<h3>[name]( [param:String name], [param:Array times], [param:Array values] )</h3>
 		<p>
-			[page:String name] - (requis) indentifiant du KeyframeTrack.<br />
+			[page:String name] - (requis) identifiant du KeyframeTrack.<br />
 			[page:Array times] - (requis) tableau de durée des keyframes.<br />
 			[page:Array values] - valeurs des keyframes aux temps spécifiés, un tableau à une dimension de composants de vecteurs.<br />
 			[page:Constant interpolation] - le type d'interpolation à utiliser. Voir

+ 2 - 2
docs/api/fr/audio/AudioAnalyser.html

@@ -72,7 +72,7 @@
 
 		<h3>[property:Uint8Array data]</h3>
 		<p>
-		Un Uint8Array avec une taille determinée par [link:https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/frequencyBinCount analyser.frequencyBinCount]
+		Un Uint8Array avec une taille déterminée par [link:https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/frequencyBinCount analyser.frequencyBinCount]
 		utilisé pour stocker les données d'analyse.
 		</p>
 
@@ -88,7 +88,7 @@
 
 		<h3>[method:Number getAverageFrequency]()</h3>
 		<p>
-		Recupère la moyenne des fréquences retournées par la méthode [page:AudioAnalyser.getFrequencyData getFrequencyData].
+		Récupère la moyenne des fréquences retournées par la méthode [page:AudioAnalyser.getFrequencyData getFrequencyData].
 		</p>
 
 		<h2>Source</h2>

+ 1 - 1
docs/api/fr/cameras/ArrayCamera.html

@@ -38,7 +38,7 @@
 
 		<h3>[property:Boolean isArrayCamera]</h3>
 		<p>
-			Flag en lecture seul qui pemet de vérifier si un objet donné est de type [name].
+			Flag en lecture seul qui permet de vérifier si un objet donné est de type [name].
 		</p>
 
 		<h2>Méthodes</h2>

+ 2 - 2
docs/api/fr/cameras/Camera.html

@@ -21,7 +21,7 @@
 
 		<h3>[name]()</h3>
 		<p>
-			Crée une nouvelle [name]. Notez que cette classe n'est pas censée être appellée directement;
+			Crée une nouvelle [name]. Notez que cette classe n'est pas censée être appelée directement;
 			vous aurez sans doute besoin d'une [page:PerspectiveCamera] ou d'une [page:OrthographicCamera] à la place.
 		</p>
 
@@ -31,7 +31,7 @@
 
 		<h3>[property:Boolean isCamera]</h3>
 		<p>
-			Flag en lecture seul qui pemet de vérifier si un objet donné est de type [name].
+			Flag en lecture seul qui permet de vérifier si un objet donné est de type [name].
 		</p>
 
 		<h3>[property:Layers layers]</h3>

+ 1 - 1
docs/api/fr/cameras/CubeCamera.html

@@ -76,7 +76,7 @@
 		scene -- La scène actuelle
 		</p>
 		<p>
-		Appellez cette méthode pour mettre à jour le [page:CubeCamera.renderTarget renderTarget].
+		Appelez cette méthode pour mettre à jour le [page:CubeCamera.renderTarget renderTarget].
 		</p>
 
 		<h2>Source</h2>

+ 2 - 2
docs/api/fr/cameras/OrthographicCamera.html

@@ -75,7 +75,7 @@
 
 		<h3>[property:Boolean isOrthographicCamera]</h3>
 		<p>
-			Flag en lecture seul qui pemet de vérifier si un objet donné est de type [name].
+			Flag en lecture seul qui permet de vérifier si un objet donné est de type [name].
 		</p>
 
 		<h3>[property:Float left]</h3>
@@ -131,7 +131,7 @@
 
 		<h3>[method:Object toJSON]([param:Object meta])</h3>
 		<p>
-		meta -- objet contenant des metadatas comme des objets ou des textures dans des descendants des objets.<br />
+		meta -- objet contenant des métadonnées comme des objets ou des textures dans des descendants des objets.<br />
 		Convertis la caméra en [link:https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4 JSON Object/Scene format] three.js.
 		</p>
 

+ 6 - 6
docs/api/fr/cameras/PerspectiveCamera.html

@@ -51,7 +51,7 @@
 		<h2>Propriétés</h2>
 		<p>
 			Voir la classe [page:Camera] pour connaître les propriétés communes.<br>
-			Notez qu'après avoir changé la grande majorité de ces propriétés vous devrez appeller
+			Notez qu'après avoir changé la grande majorité de ces propriétés vous devrez appeler
 			[page:PerspectiveCamera.updateProjectionMatrix .updateProjectionMatrix] afin que les changements prennent effet.
 		</p>
 
@@ -67,7 +67,7 @@
 
 		<h3>[property:Float filmGauge]</h3>
 		<p>Taille de la pellicule utilisée pour l'axe le plus grand. La valeur par défaut est 35 (millimètres). Ce paramètre n'influe pas sur la matrice de projection sauf si .filmOffset est à une valeur non-nulle </p>
-		
+
 		<h3>[property:Float filmOffset]</h3>
 		<p>Décalage horizontal dans la même unité que `.filmGauge`. La valeur par défaut est `0`.</p>
 
@@ -82,7 +82,7 @@
 
 		<h3>[property:Boolean isPerspectiveCamera]</h3>
 		<p>
-			Flag en lecture seul qui pemet de vérifier si un objet donné est de type [name].
+			Flag en lecture seul qui permet de vérifier si un objet donné est de type [name].
 		</p>
 
 
@@ -98,7 +98,7 @@
 		<h3>[property:Object view]</h3>
 		<p>
 			Spécification du frustum ou nul.
-			La valeur est fixée par la méthode [page:PerspectiveCamera.setViewOffset .setViewOffset] 
+			La valeur est fixée par la méthode [page:PerspectiveCamera.setViewOffset .setViewOffset]
 			et supprimée par la méthode [page:PerspectiveCamera.clearViewOffset .clearViewOffset].
 		</p>
 
@@ -113,7 +113,7 @@
 		<p>Retire tout décalage mis en place par la méthode [page:PerspectiveCamera.setViewOffset .setViewOffset].</p>
 
 		<h3>[method:Float getEffectiveFOV]()</h3>
-		<p>Retourne l'angle du champ de vision verticalen degrés en prenant en compte le .zoom.</p>
+		<p>Retourne l'angle du champ de vision vertical en degrés en prenant en compte le .zoom.</p>
 
 		<h3>[method:Float getFilmHeight]()</h3>
 		<p>
@@ -193,7 +193,7 @@ camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
 
 		<h3>[method:Object toJSON]([param:Object meta])</h3>
 		<p>
-		meta -- objet contenant des metadatas comme des objets ou des textures dans des descendants des objets.<br />
+		meta -- objet contenant des métadonnées comme des objets ou des textures dans des descendants des objets.<br />
 		Convertis la caméra en [link:https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4 JSON Object/Scene format] three.js.
 		</p>
 

+ 1 - 1
docs/api/fr/constants/CustomBlendingEquations.html

@@ -50,7 +50,7 @@
 		THREE.SrcAlphaSaturateFactor
 		</code>
 
-		<h2>Facteur de déstination</h2>
+		<h2>Facteur de destination</h2>
 		<p>
 			Tous les facteurs source sont valides comme facteurs de destination, à l'exception de <code>THREE.SrcAlphaSaturateFactor</code>
 		</p>

+ 12 - 12
docs/api/fr/constants/Textures.html

@@ -48,12 +48,12 @@
 		Ces constantes définissent les propriétés des textures [page:Texture.wrapS wrapS] et [page:Texture.wrapT wrapT],
 		qui définissent l'emballage de texture horizontal et vertical.<br /><br />
 
-		Avec [page:constant RepeatWrapping] la texure se répetera simplement à l'infini.<br /><br />
+		Avec [page:constant RepeatWrapping] la texure se répétera simplement à l'infini.<br /><br />
 
 		[page:constant ClampToEdgeWrapping] est la valeur par défaut.
 		Le dernier pixel de la texture s'étend jusqu'au bord du maillage.<br /><br />
 
-		Avec [page:constant MirroredRepeatWrapping] la texure se répetera à l'infini avec un effet mirroir à chaque répétition.
+		Avec [page:constant MirroredRepeatWrapping] la texure se répétera à l'infini avec un effet miroir à chaque répétition.
 		</p>
 
 		<h2>Filtres de grossissement</h2>
@@ -206,7 +206,7 @@
 		</code>
 		<p>
 		À utiliser avec la propriété [page:Texture.format format] d'une [page:CompressedTexture CompressedTexture],
-		ceux-ci doivent supporter l'extension 
+		ceux-ci doivent supporter l'extension
 		[link:https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/ WEBGL_compressed_texture_s3tc] <br /><br />
 
 		Il existe 4 formats [link:https://en.wikipedia.org/wiki/S3_Texture_Compression S3TC] disponibles avec cette extension. Ce sont :<br />
@@ -350,23 +350,23 @@
 		[page:constante R8] stocke la composante rouge sur 8 bits.<br /><br />
 
 		[page:constant R8_SNORM] stocke la composante rouge sur 8 bits. Le composant est stocké comme normalisé. <br /><br />
-		
+
 		[page:constant R8I] stocke la composante rouge sur 8 bits. Le composant est stocké sous la forme d'un entier. <br /><br />
-		
+
 		[page:constant R8UI] stocke la composante rouge sur 8 bits. Le composant est stocké sous la forme d'un entier non signé. <br /><br />
-		
+
 		[page:constant R16I] stocke la composante rouge sur 16 bits. Le composant est stocké sous la forme d'un entier. <br /><br />
-		
+
 		[page:constant R16UI] stocke la composante rouge sur 16 bits. Le composant est stocké sous la forme d'un entier non signé. <br /><br />
-		
+
 		[page:constant R16F] stocke la composante rouge sur 16 bits. Le composant est stocké en point flottant. <br /><br />
-		
+
 		[page:constant R32I] stocke la composante rouge sur 32 bits. Le composant est stocké sous la forme d'un entier. <br /><br />
-		
+
 		[page:constant R32UI] stocke la composante rouge sur 32 bits. Le composant est stocké sous la forme d'un entier non signé. <br /><br />
-		
+
 		[page:constant R32F] stocke la composante rouge sur 32 bits. Le composant est stocké en point flottant. <br /><br />
-		
+
 		[page:constante RG8] stocke les composantes rouge et verte sur 8 bits chacune.<br /><br />
 
 		[page:constant RG8_SNORM] stocke les composantes rouge et verte sur 8 bits chacune.

+ 2 - 2
docs/api/fr/geometries/BoxGeometry.html

@@ -13,7 +13,7 @@
 
 		<p class="desc">
 			[name] est une classe de géométrie pour un cuboïde rectangulaire avec une largeur 'width', une hauteur 'height', et une profondeur 'depth' données.
-			À la création, le cuboïde est centré sur l'origine, chaque arrête est parallèle à l'un des axes. 
+			À la création, le cuboïde est centré sur l'origine, chaque arrête est parallèle à l'un des axes.
 		</p>
 
 		<iframe id="scene" src="scenes/geometry-browser.html#BoxGeometry"></iframe>
@@ -42,7 +42,7 @@
 		scene.add( cube );
 		</code>
 
-		<h2>Contructeur</h2>
+		<h2>Constructeur</h2>
 
 		<h3>[name]([param:Float width], [param:Float height], [param:Float depth], [param:Integer widthSegments], [param:Integer heightSegments], [param:Integer depthSegments])</h3>
 		<p>

+ 1 - 1
docs/api/fr/geometries/CapsuleGeometry.html

@@ -13,7 +13,7 @@
 
 		<p class="desc">
 			[name] est une classe de géométrie pour une capsule avec des rayons et une hauteur donnés.
-			Elle est construite à l'aide de demi-shpères.
+			Elle est construite à l'aide de demi-sphères.
 		</p>
 
 		<iframe id="scene" src="scenes/geometry-browser.html#CapsuleGeometry"></iframe>

+ 4 - 4
docs/api/fr/materials/LineBasicMaterial.html

@@ -47,14 +47,14 @@
 
 		<p>
 		[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 
-		L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaine de caractères hexadécimale,
+		L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaîne de caractères hexadécimale,
 		 ayant la valeur `0xffffff` (blanc) par défaut. [page:Color.set]( color ) est appelée en interne.
 		</p>
 
 		<h2>Propriétés</h2>
-		<p>Voir la classe [page:Material] pour les prppriétés communes.</p>
+		<p>Voir la classe [page:Material] pour les propriétés communes.</p>
 
 		<h3>[property:Color color]</h3>
 		<p>[page:Color], couleur du matériau, par défaut en blanc (0xffffff).</p>
@@ -67,7 +67,7 @@
 			Contrôle l'épaisseur des lignes, la valeur par défaut est `1`.<br /><br />
 
 			A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupart des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 

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

@@ -40,7 +40,7 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 		[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:LineBasicMaterial]) peut être passée dans l'objet.
+		Toute propriété du matériau (y compris toute propriété héritée de [page:LineBasicMaterial]) peut être passée dans l'objet.
 		</p>
 
 

+ 6 - 6
docs/api/fr/materials/Material.html

@@ -194,11 +194,11 @@
 		<p>Nombre unique pour cette instance de matériau.</p>
 
 		<h3>[property:String name]</h3>
-		<p>Nom optionnel de l'object (n'a pas besoin d'être unique). La valeur par défaut est une chaine de caractères vide.</p>
+		<p>Nom optionnel de l'object (n'a pas besoin d'être unique). La valeur par défaut est une chaîne de caractères vide.</p>
 
 		<h3>[property:Boolean needsUpdate]</h3>
 		<p>
-		Scécifie que le matériau doit être recompilé.
+		Spécifie que le matériau doit être recompilé.
 		</p>
 
 		<h3>[property:Float opacity]</h3>
@@ -356,22 +356,22 @@
 			Contrairement aux propriétés, le callback n'est pas pris en charge par [page:Material.clone .clone](), [page:Material.copy .copy]() et [page:Material.toJSON .toJSON]().
 		</p>
 		<p>
-			This callback is only supported in `WebGLRenderer` (not `WebGPURenderer`). 
+			This callback is only supported in `WebGLRenderer` (not `WebGPURenderer`).
 		</p>
 
 		<h3>
 			[method:undefined onBeforeRender]( [param:WebGLRenderer renderer], [param:Scene scene], [param:Camera camera], [param:BufferGeometry geometry], [param:Object3D object], [param:Group group] )
 		</h3>
 		<p>
-			An optional callback that is executed immediately before the material is used to 
+			An optional callback that is executed immediately before the material is used to
 			render a 3D object.
 		</p>
 		<p>
-			Unlike properties, the callback is not supported by [page:Material.clone .clone](), 
+			Unlike properties, the callback is not supported by [page:Material.clone .clone](),
 			[page:Material.copy .copy]() and [page:Material.toJSON .toJSON]().
 		</p>
 		<p>
-			This callback is only supported in `WebGLRenderer` (not `WebGPURenderer`). 
+			This callback is only supported in `WebGLRenderer` (not `WebGPURenderer`).
 		</p>
 
 		<h3>[method:String customProgramCacheKey]()</h3>

+ 5 - 5
docs/api/fr/materials/MeshBasicMaterial.html

@@ -41,9 +41,9 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 
-			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaine de caractères hexadécimale,
+			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaîne de caractères hexadécimale,
 		 ayant la valeur `0xffffff` (blanc) par défaut. [page:Color.set]( color ) est appelée en interne.
 		</p>
 
@@ -53,11 +53,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 
@@ -138,7 +138,7 @@
 		<p>Contrôle l'épaisseur du filaire. La valeur par défaut est 1.<br /><br />
 
 			A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupart des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 

+ 4 - 4
docs/api/fr/materials/MeshDepthMaterial.html

@@ -36,7 +36,7 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.
 		</p>
 
 		<h2>Propriétés</h2>
@@ -45,11 +45,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 
@@ -94,7 +94,7 @@
 		<p>Contrôle l'épaisseur du filaire. La valeur par défaut est 1.<br /><br />
 
 		A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupart des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 

+ 3 - 3
docs/api/fr/materials/MeshDistanceMaterial.html

@@ -45,7 +45,7 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.
 		</p>
 
 		<h2>Propriétés</h2>
@@ -54,11 +54,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 

+ 5 - 5
docs/api/fr/materials/MeshLambertMaterial.html

@@ -46,9 +46,9 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 
-			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaine de caractères hexadécimale,
+			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaîne de caractères hexadécimale,
 		 ayant la valeur `0xffffff` (blanc) par défaut. [page:Color.set]( color ) est appelée en interne.
 		</p>
 
@@ -58,11 +58,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 
@@ -213,7 +213,7 @@
 		<p>Contrôle l'épaisseur du filaire. La valeur par défaut est 1.<br /><br />
 
 		A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupart des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 

+ 3 - 3
docs/api/fr/materials/MeshMatcapMaterial.html

@@ -40,7 +40,7 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 
 			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaine de caractères hexadécimale,
 		 ayant la valeur `0xffffff` (blanc) par défaut. [page:Color.set]( color ) est appelée en interne.
@@ -52,11 +52,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 

+ 2 - 2
docs/api/fr/materials/MeshNormalMaterial.html

@@ -36,7 +36,7 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.
 		</p>
 
 
@@ -112,7 +112,7 @@
 		<p>Contrôle l'épaisseur du filaire. La valeur par défaut est 1.<br /><br />
 
 		A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupart des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 

+ 6 - 6
docs/api/fr/materials/MeshPhongMaterial.html

@@ -42,12 +42,12 @@
 
 		<h2>Constructeur</h2>
 
-		<h3>[name]( [param:Object parameters] )</h3> 
+		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 
-			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaine de caractères hexadécimale,
+			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaîne de caractères hexadécimale,
 		 ayant la valeur `0xffffff` (blanc) par défaut. [page:Color.set]( color ) est appelée en interne.
 		</p>
 
@@ -57,11 +57,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 
@@ -231,7 +231,7 @@
 		<p>Contrôle l'épaisseur du filaire. La valeur par défaut est 1.<br /><br />
 
 		A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 

+ 5 - 5
docs/api/fr/materials/MeshStandardMaterial.html

@@ -70,9 +70,9 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 
-			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaine de caractères hexadécimale,
+			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaîne de caractères hexadécimale,
 		 ayant la valeur `0xffffff` (blanc) par défaut. [page:Color.set]( color ) est appelée en interne.
 		</p>
 
@@ -82,11 +82,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 
@@ -255,7 +255,7 @@
 		<p>Contrôle l'épaisseur du filaire. La valeur par défaut est 1.<br /><br />
 
 			A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupart des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 

+ 5 - 5
docs/api/fr/materials/MeshToonMaterial.html

@@ -41,9 +41,9 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 
-			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaine de caractères hexadécimale,
+			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaîne de caractères hexadécimale,
 		 ayant la valeur `0xffffff` (blanc) par défaut. [page:Color.set]( color ) est appelée en interne.
 		</p>
 
@@ -53,11 +53,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 
@@ -184,7 +184,7 @@ La valeur par défaut est un [page:Vector2] défini sur (1,1).
 		<p>Contrôle l'épaisseur du filaire. La valeur par défaut est 1.<br /><br />
 
 		A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupart des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 

+ 4 - 4
docs/api/fr/materials/PointsMaterial.html

@@ -57,9 +57,9 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 
-			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaine de caractères hexadécimale,
+			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaîne de caractères hexadécimale,
 		 ayant la valeur `0xffffff` (blanc) par défaut. [page:Color.set]( color ) est appelée en interne.
 		</p>
 
@@ -69,11 +69,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 

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

@@ -45,7 +45,7 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material] and [page:ShaderMaterial]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material] and [page:ShaderMaterial]) peut être passée dans l'objet.<br /><br />
 		</p>
 
 

+ 3 - 3
docs/api/fr/materials/ShaderMaterial.html

@@ -262,7 +262,7 @@ et la page [page:BufferAttribute] pour un aperçu détaillé de l'API `BufferAtt
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.
 		</p>
 
 		<h2>Propriétés</h2>
@@ -361,7 +361,7 @@ et la page [page:BufferAttribute] pour un aperçu détaillé de l'API `BufferAtt
 		<p>Contrôle l'épaisseur du filaire. La valeur par défaut est 1.<br /><br />
 
 		A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 
@@ -411,7 +411,7 @@ et la page [page:BufferAttribute] pour un aperçu détaillé de l'API `BufferAtt
 		<p>Contrôle l'épaisseur du filaire. La valeur par défaut est 1.<br /><br />
 
 		A cause des limitations de [link:https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf OpenGL Core Profile]
-			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupârt des plateformes, l'épaisseur de ligne (linewidth) sera toujours 
+			avec le moteur de rendu [page:WebGLRenderer WebGL] sur la plupart des plateformes, l'épaisseur de ligne (linewidth) sera toujours
 			à 1, indépendamment de la valeur définie.
 		</p>
 

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

@@ -41,7 +41,7 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 		</p>
 
 

+ 4 - 4
docs/api/fr/materials/SpriteMaterial.html

@@ -36,9 +36,9 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 			[page:Object parameters] - (optionnel) un objet avec une ou plusieurs propriétés définissant l'apparence du matériau.
-		Toute propriété du matériau (y compris toute proprioété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
+		Toute propriété du matériau (y compris toute propriété héritée de [page:Material]) peut être passée dans l'objet.<br /><br />
 
-			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaine de caractères hexadécimale,
+			L'exception est la propriété [page:Hexadecimal color], qui peut être passée comme une chaîne de caractères hexadécimale,
 		 ayant la valeur `0xffffff` (blanc) par défaut. [page:Color.set]( color ) est appelée en interne.
 
 		 Les SpriteMaterials ne sont pas coupés en utilisant [page:Material.clippingPlanes].
@@ -51,11 +51,11 @@
 		<h3>[property:Texture alphaMap]</h3>
 		<p>La carte alpha est une texture en niveaux de gris qui contrôle l'opacité sur la surface
 			(noir : entièrement transparent ; blanc : entièrement opaque). La valeur par défaut est nulle.<br /><br />
-			
+
 			Seule la couleur de la texture est utilisée, en ignorant le canal alpha s'il en existe un.
 			Pour les textures RGB et RGBA, le moteur de rendu [page:WebGLRenderer WebGL] utilisera le
 			canal vert lors de l'échantillonnage de cette texture en raison du peu de précision supplémentaire fourni
-			pour le vert dans les formats RVB 565 compressés DXT et non compressés. 
+			pour le vert dans les formats RVB 565 compressés DXT et non compressés.
 			Les textures avec uniquement de la luminance ou les textures luminance/alpha fonctionneront également comme prévu.
 		</p>
 

+ 1 - 1
docs/api/it/loaders/ImageBitmapLoader.html

@@ -38,7 +38,7 @@
 		// carica un'immagine
 		loader.load(
 			// URL della risorsa
-			'textures/skyboxsun25degtest.png',
+			'image.png',
 
 			// onLoad callback
 			function ( imageBitmap ) {

+ 1 - 1
docs/api/it/loaders/ImageLoader.html

@@ -26,7 +26,7 @@
 		// carica un'immagine
 		loader.load(
 			// URL della risorsa
-			'textures/skyboxsun25degtest.png',
+			'image.png',
 
 			// onLoad callback
 			function ( image ) {

+ 1 - 1
docs/api/ko/core/Object3D.html

@@ -197,7 +197,7 @@
 		<h3>[property:String uuid]</h3>
 		<p>
 		이 객체 인스턴스의 [link:http://en.wikipedia.org/wiki/Universally_unique_identifier UUID]입니다.
-		자동으로 할당되며, 수정할 수 없습니다.
+		자동으로 할당되니 수정하지 마십시오.
 		</p>
 
 		<h3>[property:Boolean visible]</h3>

+ 3 - 3
docs/api/zh/core/Layers.html

@@ -10,9 +10,9 @@
 		<h1>[name]</h1>
 
 		<p class="desc">
-			[page:Layers] 对象为 [page:Object3D] 分配 1个到 32 个图层。32个图层从 0 到 31 编号标记。
-			在内部实现上,每个图层对象被存储为一个 [link:https://en.wikipedia.org/wiki/Mask_(computing) bit mask]
-			默认的,所有 [page:Object3D] 对象都存储在第 0 个图层上。<br /><br />
+			[page:Layers] 对象将 [page:Object3D] 分配给编号为0到31的32个层中的1个或多个,
+			这些层在内部存储为 [link:https://en.wikipedia.org/wiki/Mask_(computing) 位掩码] 
+			默认情况下,所有 [page:Object3D] 都是层0的成员。<br /><br />
 
 			图层对象可以用于控制对象的显示。当 [page:Camera camera] 的内容被渲染时与其共享图层相同的物体会被显示。每个对象都需要与一个
 			[page:Camera camera] 共享图层。<br /><br />

+ 1 - 1
docs/api/zh/loaders/ImageBitmapLoader.html

@@ -33,7 +33,7 @@
 		// 加载一个图片资源
 		loader.load(
 			// 资源的URL
-			'textures/skyboxsun25degtest.png',
+			'image.png',
 
 			// onLoad回调
 			function ( imageBitmap ) {

+ 1 - 1
docs/api/zh/loaders/ImageLoader.html

@@ -26,7 +26,7 @@
 		// 加载一个图片资源
 		loader.load(
 			// 资源URL
-			'textures/skyboxsun25degtest.png',
+			'image.png',
 
 			// onLoad回调
 			function ( image ) {

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

@@ -53,7 +53,7 @@
 
 		<h3>[property:Boolean isLineDashedMaterial]</h3>
 		<p>
-			Read-only flag to check if a given object is of type [name].
+			只读标志,用于检查给定对象是否属于 [name] 类型。
 		</p>
 
 		<h3>[property:number scale]</h3>

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

@@ -320,15 +320,13 @@
 	[method:undefined onBeforeRender]( [param:WebGLRenderer renderer], [param:Scene scene], [param:Camera camera], [param:BufferGeometry geometry], [param:Object3D object], [param:Group group] )
 </h3>
 <p>
-	An optional callback that is executed immediately before the material is used to 
-	render a 3D object.
+	在使用材质渲染 3D 对象之前立即执行的可选回调。
 </p>
 <p>
-	Unlike properties, the callback is not supported by [page:Material.clone .clone](), 
-	[page:Material.copy .copy]() and [page:Material.toJSON .toJSON]().
+	与属性不同,回调不支持 [page:Material.clone .clone]()、[page:Material.copy .copy]() 和 [page:Material.toJSON .toJSON]()。
 </p>
 <p>
-	This callback is only supported in `WebGLRenderer` (not `WebGPURenderer`). 
+	此回调仅支持 `WebGLRenderer` (不支持 `WebGPURenderer`)。
 </p>
 
 <h3>[method:String customProgramCacheKey]()</h3>

+ 5 - 2
docs/api/zh/materials/MeshBasicMaterial.html

@@ -73,6 +73,11 @@
 		<h3>[property:Texture envMap]</h3>
 		<p>环境贴图。默认值为null。</p>
 
+		<h3>[property:Euler envMapRotation]</h3>
+		<p>
+			环境贴图的旋转(以弧度为单位)。默认值为 `(0,0,0)`。
+		</p>
+
 		<h3>[property:Boolean fog]</h3>
 		<p>材质是否受雾影响。默认为*true*。</p>
 
@@ -95,8 +100,6 @@
 		<h3>[property:Float refractionRatio]</h3>
 		<p> 空气的折射率(IOR)(约为1)除以材质的折射率。它与环境映射模式[page:Textures THREE.CubeRefractionMapping]
 			和[page:Textures THREE.EquirectangularRefractionMapping]一起使用。
-			The index of refraction (IOR) of air (approximately 1) divided by the index of refraction of the material.
-			It is used with environment mapping mode [page:Textures THREE.CubeRefractionMapping].
 			折射率不应超过1。默认值为*0.98*。
 		</p>
 

+ 3 - 0
docs/api/zh/materials/MeshDepthMaterial.html

@@ -67,6 +67,9 @@
 		<p> 位移贴图在网格顶点上的偏移量。如果没有设置位移贴图,则不会应用此值。默认值为0。
 		</p>
 
+		<h3>[property:Boolean fog]</h3>
+		<p>材质是否受到雾的影响。默认值为 `false`。</p>
+
 		<h3>[property:Texture map]</h3>
 		<p>
 			颜色贴图。可以选择包括一个alpha通道,通常与[page:Material.transparent .transparent]

+ 4 - 1
docs/api/zh/materials/MeshDistanceMaterial.html

@@ -9,7 +9,7 @@
 	<body>
 		[page:Material] &rarr;
 
-		<h1>[name]</h1>
+		<h1>距离网格材质([name])</h1>
 
 		<p class="desc">
 			[name] 在内部用于使用[page:PointLight]来实现阴影映射。
@@ -73,6 +73,9 @@
 		<p> 位移贴图在网格顶点上的偏移量。如果没有设置位移贴图,则不会应用此值。默认值为0。
 		</p>
 
+		<h3>[property:Boolean fog]</h3>
+		<p>材质是否受到雾的影响。默认值为 `false`。</p>
+
 		<h3>[property:Texture map]</h3>
 		<p>
 			颜色贴图。可以选择包括一个alpha通道,通常与[page:Material.transparent .transparent]

+ 11 - 7
docs/api/zh/materials/MeshLambertMaterial.html

@@ -62,7 +62,8 @@
 		<p> 该纹理的红色通道用作环境遮挡贴图。默认值为null。aoMap需要第二组UV。</p>
 
 		<h3>[property:Float aoMapIntensity]</h3>
-		<p> 环境遮挡效果的强度。默认值为1。零是不遮挡效果。</p>
+		<p> 环境光遮蔽效果的强度。范围为 0-1,其中 `0` 表示禁用环境光遮蔽。当强度为 `1` 且 [page:.aoMap] 红色通道也为 `1`时,环境光在表面上完全被遮蔽。默认值为`1`。
+		</p>
 
 		<h3>[property:Texture bumpMap]</h3>
 		<p> 用于创建凹凸贴图的纹理。黑色和白色值映射到与光照相关的感知深度。凹凸实际上不会影响对象的几何形状,只影响光照。如果定义了法线贴图,则将忽略该贴图。
@@ -110,6 +111,11 @@
 		<h3>[property:Texture envMap]</h3>
 		<p> 环境贴图。默认值为null。</p>
 
+		<h3>[property:Euler envMapRotation]</h3>
+		<p>
+			环境贴图的旋转(以弧度为单位)。默认值为 `(0,0,0)`。
+		</p>
+
 		<h3>[property:Boolean flatShading]</h3>
 		<p> 定义材质是否使用平面着色进行渲染。默认值为false。
 		</p>
@@ -130,9 +136,9 @@
 		</p>
 
 		<h3>[property:Texture normalMap]</h3>
-		<p> 用于创建法线贴图的纹理。RGB值会影响每个像素片段的曲面法线,并更改颜色照亮的方式。法线贴图不会改变曲面的实际形状,只会改变光照。
-			In case the material has a normal map authored using the left handed convention, the y component of normalScale
-			should be negated to compensate for the different handedness.
+		<p>
+			用于创建法线贴图的纹理。RGB 值会影响每个像素片段的曲面法线,并更改颜色照亮的方式。法线贴图不会改变曲面的实际形状,只会改变光照。
+			如果材质的法线贴图使用左手惯例编写,则应将 normalScale 的 y 分量取反以补偿不同的手性。
 		</p>
 
 		<h3>[property:Integer normalMapType]</h3>
@@ -150,9 +156,7 @@
 		<h3>[property:Float refractionRatio]</h3>
 		<p>空气的折射率(IOR)(约为1)除以材质的折射率。它与环境映射模式[page:Textures THREE.CubeRefractionMapping]
 			和[page:Textures THREE.EquirectangularRefractionMapping]一起使用。
-			The index of refraction (IOR) of air (approximately 1) divided by the index of refraction of the material.
-			It is used with environment mapping mode [page:Textures THREE.CubeRefractionMapping].
-			折射率不应超过1。默认值为*0.98*。
+			折射率不应超过 1。默认值为 *0.98*。
 		</p>
 
 		<h3>[property:Texture specularMap]</h3>

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

@@ -9,7 +9,7 @@
 	<body>
 		[page:Material] &rarr;
 
-		<h1>[name]</h1>
+		<h1>材质捕捉网格材质([name])</h1>
 
 		<p class="desc">
 			[name] 由一个材质捕捉(MatCap,或光照球(Lit Sphere))纹理所定义,其编码了材质的颜色与明暗。<br/><br/>

+ 3 - 2
docs/api/zh/materials/MeshNormalMaterial.html

@@ -66,6 +66,9 @@
 		<p> 定义材质是否使用平面着色进行渲染。默认值为false。
 		</p>
 
+		<h3>[property:Boolean fog]</h3>
+		<p>材质是否受到雾的影响。默认值为 `false`。</p>
+
 		<h3>[property:Texture normalMap]</h3>
 		<p> 用于创建法线贴图的纹理。RGB值会影响每个像素片段的曲面法线,并更改颜色照亮的方式。法线贴图不会改变曲面的实际形状,只会改变光照。
 			In case the material has a normal map authored using the left handed convention, the y component of normalScale
@@ -94,8 +97,6 @@
 		<h2>方法(Methods)</h2>
 		<p>共有方法请参见其基类[page:Material]。</p>
 
-
-
 		<h2>源码(Source)</h2>
 
 		<p>

+ 8 - 3
docs/api/zh/materials/MeshPhongMaterial.html

@@ -110,6 +110,11 @@
 		<h3>[property:Texture envMap]</h3>
 		<p>环境贴图。默认值为null。</p>
 
+		<h3>[property:Euler envMapRotation]</h3>
+		<p>
+			环境贴图的旋转(以弧度为单位)。默认值为 `(0,0,0)`。
+		</p>
+
 		<h3>[property:Boolean flatShading]</h3>
 		<p> 定义材质是否使用平面着色进行渲染。默认值为false。
 		</p>
@@ -131,9 +136,9 @@
 		</p>
 
 		<h3>[property:Texture normalMap]</h3>
-		<p> 用于创建法线贴图的纹理。RGB值会影响每个像素片段的曲面法线,并更改颜色照亮的方式。法线贴图不会改变曲面的实际形状,只会改变光照。
-			In case the material has a normal map authored using the left handed convention, the y component of normalScale
-			should be negated to compensate for the different handedness.
+		<p>
+			用于创建法线贴图的纹理。RGB 值会影响每个像素片段的曲面法线,并更改颜色照亮的方式。法线贴图不会改变曲面的实际形状,只会改变光照。
+			如果材质的法线贴图使用左手惯例编写,则应将 normalScale 的 y 分量取反以补偿不同的手性。
 		</p>
 
 		<h3>[property:Integer normalMapType]</h3>

+ 67 - 11
docs/api/zh/materials/MeshPhysicalMaterial.html

@@ -17,7 +17,13 @@
 
 		<ul>
 			<li>
-				<b>Clearcoat:</b> 有些类似于车漆,碳纤,被水打湿的表面的材质需要在面上再增加一个透明的,具有一定反光特性的面。而且这个面说不定有一定的起伏与粗糙度。Clearcoat可以在不需要重新创建一个透明的面的情况下做到类似的效果。
+				<b>各向异性(Anisotropy):</b> 能够表现出拉丝金属所观察到的材料的各向异性特性。
+			</li>
+			<li>
+				<b>清漆(Clearcoat):</b> 有些类似于车漆,碳纤,被水打湿的表面的材质需要在面上再增加一个透明的,具有一定反光特性的面。而且这个面说不定有一定的起伏与粗糙度。Clearcoat 可以在不需要重新创建一个透明的面的情况下做到类似的效果。
+			</li>
+			<li>
+				<b>虹彩(Iridescence):</b> 允许渲染色调根据视角和照明角度而变化的效果。这可以在肥皂泡、油膜或许多昆虫的翅膀上看到。
 			</li>
 			<li>
 				<b>基于物理的透明度</b>:[page:Material.opacity .opacity]属性有一些限制:在透明度比较高的时候,反射也随之减少。使用基于物理的透光性[page:.transmission]属性可以让一些很薄的透明表面,例如玻璃,变得更真实一些。
@@ -26,7 +32,7 @@
 				<b>高级光线反射:</b> 为非金属材质提供了更多更灵活的光线反射。
 			</li>
 			<li>
-				<b>Sheen:</b> Can be used for representing cloth and fabric materials.
+				<b>光泽(Sheen):</b> 可用于表示布料和织物材料。
 			</li>
 		</ul>
 
@@ -55,7 +61,9 @@
 		<h2>例子</h2>
 
 		<p>
+			[example:webgl_loader_gltf_anisotropy loader / gltf / anisotropy]<br />
 			[example:webgl_materials_physical_clearcoat materials / physical / clearcoat]<br />
+			[example:webgl_loader_gltf_iridescence loader / gltf / iridescence]<br />
 			[example:webgl_loader_gltf_sheen loader / gltf / sheen]<br />
 			[example:webgl_materials_physical_transmission materials / physical / transmission]
 		</p>
@@ -72,14 +80,29 @@
 		<h2>属性(Properties)</h2>
 		<p>共有属性请参见其基类[page:Material]和[page:MeshStandardMaterial]。</p>
 
+		<h3>[property:Float anisotropy]</h3>
+		<p>
+			各向异性强度。默认值为 `0.0`。
+		</p>
+
+		<h3>[property:Texture anisotropyMap]</h3>
+		<p>
+			红色和绿色通道表示 `[-1, 1]` 切线、双切线空间中的各向异性方向,将通过 [page:.anisotropyRotation] 进行旋转。蓝色通道包含 `[0, 1]` 的强度,将与 [page:.anisotropy]相乘。默认值为 `null`。
+		</p>
+
+		<h3>[property:Float anisotropyRotation]</h3>
+		<p>
+			切线、双切线空间中各向异性的旋转,以弧度为单位从切线逆时针测量。当存在 [page:.anisotropyMap] 时,此属性为纹理中的矢量提供额外的旋转。默认值为 `0.0`。
+		</p>
+		
 		<h3>[property:Color attenuationColor]</h3>
 		<p>
-		The color that white light turns into due to absorption when reaching the attenuation distance. Default is *white* (0xffffff).
+			白光到达衰减距离后因吸收而变成的颜色。默认值为 *white* (0xffffff)。
 		</p>
 
 		<h3>[property:Float attenuationDistance]</h3>
 		<p>
-		Density of the medium given as the average distance that light travels in the medium before interacting with a particle. The value is given in world space units, and must be greater than zero. Default is `Infinity`.
+			介质的密度,表示光在与粒子相互作用之前在介质中传播的平均距离。该值以世界空间单位给出,并且必须大于零。默认值为 `Infinity`。
 		</p>
 
 		<h3>[property:Float clearcoat]</h3>
@@ -121,10 +144,9 @@
 
 		<h3>[property:Float dispersion]</h3>
 		<p>
-			Defines the strength of the angular separation of colors (chromatic aberration) transmitting through a relatively clear volume.
-			Any value zero or larger is valid, the typical range of realistic values is `[0, 1]`.
-			Default is `0` (no dispersion).
-			This property can be only be used with transmissive objects, see [page:.transmission].
+			定义穿过相对清晰体积的颜色角分离(色差)的强度。任何零或更大的值都是有效的,实际值的典型范围是 `[0, 1]`。
+			默认值为 `0` (无色散)。
+			此属性只能用于透射对象,请参见 [page:.transmission]。
 		</p>
 
 		<h3>[property:Float ior]</h3>
@@ -139,6 +161,41 @@
 			<br />
 			这模拟了非金属材质的反射率。当[page:MeshStandardMaterial metalness]为*1.0*时,此属性无效。
 		</p>
+		
+		<h3>[property:Float iridescence]</h3>
+		<p>
+			虹彩([link:https://en.wikipedia.org/wiki/Iridescence iridescence])层的强度,根据表面和观察者之间的角度模拟RGB颜色偏移,从 `0.0` 到 `1.0`。默认值为 `0.0`。
+		</p>
+
+		<h3>[property:Texture iridescenceMap]</h3>
+		<p>
+			此纹理的红色通道与 [page:.iridescence] 相乘,以实现对虹彩的每像素控制。默认值为 `null`。
+		</p>
+
+		<h3>[property:Float iridescenceIOR]</h3>
+		<p>
+			虹彩 RGB 色移效果的强度,由折射率表示。在 `1.0` 到 `2.333` 之间。
+			默认值为 `1.3`。
+		</p>
+
+		<h3>[property:Array iridescenceThicknessRange]</h3>
+		<p>
+			由 2 个元素组成的数组,指定虹彩层的最小和最大厚度。
+			虹彩层的厚度与 [page:.thickness] 对 [page:.ior] 的影响相同。默认值为 `[100, 400]`。<br />
+
+			如果未定义 [page:.iridescenceThicknessMap],则虹彩厚度将仅使用给定数组的第二个元素。
+		</p>
+
+		<h3>[property:Texture iridescenceThicknessMap]</h3>
+		<p>
+			一种定义虹彩层厚度的纹理,存储在绿色通道中。厚度的最小值和最大值由 [page:.iridescenceThicknessRange] 数组定义:<br/>
+			<ul>
+				<li>绿色通道中的 `0.0` 将导致厚度等于数组的第一个元素。</li>
+				<li>绿色通道中的 `1.0` 将导致厚度等于数组的第二个元素。</li>
+				<li>中间的值将在数组元素之间线性插入。</li>
+			</ul>
+			默认值为 `null`。
+		</p>
 
 		<h3>[property:Float sheen]</h3>
 		<p>
@@ -187,15 +244,14 @@
 
 		<h3>[property:Float thickness]</h3>
 		<p>
-		The thickness of the volume beneath the surface. The value is given in the coordinate space of the mesh. If the value is 0 the material is thin-walled. Otherwise the material is a volume boundary. Default is *0*.
+			表面下体积的厚度。该值在网格的坐标空间中给出。如果该值为 *0*,则材料为薄壁。否则,材质将成为体积边界。默认值为 *0*。
 		</p>
 
 		<h3>[property:Texture thicknessMap]</h3>
 		<p>
-		A texture that defines the thickness, stored in the G channel. This will be multiplied by [page:.thickness]. Default is *null*.
+			定义厚度的纹理,存储在 G 通道中。这将与 [page:.thickness] 相乘。默认值为 *null*。
 		</p>
 
-
 		<h3>[property:Float transmission]</h3>
 		<p>
 		透光率(或者说透光性),范围从*0.0*到*1.0*。默认值是*0.0*。<br />

+ 8 - 11
docs/api/zh/materials/MeshStandardMaterial.html

@@ -132,6 +132,11 @@
 			环境贴图,为了能够保证物理渲染准确,您应该添加由[page:PMREMGenerator]预处理过的环境贴图,默认为null。
 		</p>
 
+		<h3>[property:Euler envMapRotation]</h3>
+		<p>
+			环境贴图的旋转(以弧度为单位)。默认值为 `(0,0,0)`。
+		</p>
+
 		<h3>[property:Float envMapIntensity]</h3>
 		<p> 通过乘以环境贴图的颜色来缩放环境贴图的效果。</p>
 
@@ -169,9 +174,9 @@
 		<p> 该纹理的蓝色通道用于改变材质的金属度。</p>
 
 		<h3>[property:Texture normalMap]</h3>
-		<p>用于创建法线贴图的纹理。RGB值会影响每个像素片段的曲面法线,并更改颜色照亮的方式。法线贴图不会改变曲面的实际形状,只会改变光照。
-			In case the material has a normal map authored using the left handed convention, the y component of normalScale
-			should be negated to compensate for the different handedness.
+		<p>
+			用于创建法线贴图的纹理。RGB 值会影响每个像素片段的曲面法线,并更改颜色照亮的方式。法线贴图不会改变曲面的实际形状,只会改变光照。
+			如果材质的法线贴图使用左手惯例编写,则应将 normalScale 的 y 分量取反以补偿不同的手性。
 		</p>
 
 		<h3>[property:Integer normalMapType]</h3>
@@ -183,14 +188,6 @@
 		<p> 法线贴图对材质的影响程度。典型范围是0-1。默认值是[page:Vector2]设置为(1,1)。
 		</p>
 
-		<h3>[property:Float refractionRatio]</h3>
-		<p> 空气的折射率(IOR)(约为1)除以材质的折射率。它与环境映射模式[page:Textures THREE.CubeRefractionMapping]
-			和[page:Textures THREE.EquirectangularRefractionMapping]一起使用。
-			The index of refraction (IOR) of air (approximately 1) divided by the index of refraction of the material.
-			It is used with environment mapping mode [page:Textures THREE.CubeRefractionMapping].
-			折射率不应超过1。默认值为*0.98*。
-		</p>
-
 		<h3>[property:Float roughness]</h3>
 		<p> 材质的粗糙程度。0.0表示平滑的镜面反射,1.0表示完全漫反射。默认值为1.0。如果还提供roughnessMap,则两个值相乘。
 		</p>

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

@@ -9,7 +9,7 @@
 	<body>
 		[page:Material] &rarr;
 
-		<h1>[name]</h1>
+		<h1>卡通网格材质([name])</h1>
 
 		<div class="desc">一种实现卡通着色的材质。</div>
 

+ 3 - 1
docs/api/zh/materials/PointsMaterial.html

@@ -54,7 +54,9 @@
 			[example:webgl_points_sprites WebGL / points / sprites]
 		</p>
 
-		<h2>[name]( [param:Object parameters] )</h2>
+		<h2>构造函数(Constructor)</h2>
+
+		<h3>[name]( [param:Object parameters] )</h3>
 		<p> [page:Object parameters] - (可选)用于定义材质外观的对象,具有一个或多个属性。
 			材质的任何属性都可以从此处传入(包括从[page:Material]继承的任何属性)。<br /><br />
 

+ 4 - 4
docs/api/zh/materials/ShaderMaterial.html

@@ -300,7 +300,7 @@ this.extensions = {
 
 		<h3>[property:String glslVersion]</h3>
 		<p>
-		Defines the GLSL version of custom shader code. Valid values are *THREE.GLSL1* or *THREE.GLSL3*. Default is *null*.
+			定义自定义着色器代码的 GLSL 版本。有效值为 *THREE.GLSL1* 或 *THREE.GLSL3*。默认值为 *null*。
 		</p>
 
 		<h3>[property:String index0AttributeName]</h3>
@@ -311,7 +311,7 @@ this.extensions = {
 
 		<h3>[property:Boolean isShaderMaterial]</h3>
 		<p>
-			Read-only flag to check if a given object is of type [name].
+			只读标志,用于检查给定对象是否为 [name]。
 		</p>
 
 		<h3>[property:Boolean lights]</h3>
@@ -342,12 +342,12 @@ this.extensions = {
 
 		<h3>[property:Boolean uniformsNeedUpdate]</h3>
 		<p>
-		Can be used to force a uniform update while changing uniforms in [page:Object3D.onBeforeRender](). Default is *false*.
+			可用于在 [page:Object3D.onBeforeRender]()中更改 uniforms 时强制进行 uniforms 更新。默认值为 *false*。
 		</p>
 
 		<h3>[property:Boolean vertexColors]</h3>
 		<p>
-		Defines whether vertex coloring is used. Default is *false*.
+			定义是否使用顶点着色。默认为 *false*。
 		</p>
 
 		<h3>[property:String vertexShader]</h3>

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

@@ -48,7 +48,7 @@
 		<p>共有属性请参见其基类[page:Material]。</p>
 
 		<h3>[property:Color color]</h3>
-		<p>[page:Color] of the material, by default set to black (0x000000).</p>
+		<p>材质的颜色 [page:Color] ,默认设置为黑色 (0x000000)。</p>
 
 		<h3>[property:Boolean fog]</h3>
 		<p>材质是否受雾影响。默认为*true*。</p>

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

@@ -61,11 +61,11 @@
 		<p>材质的颜色([page:Color]),默认值为白色 (0xffffff)。 [page:.map]会和 color 相乘。</p>
 
 		<h3>[property:Boolean fog]</h3>
-		<p>材质是否受雾影响。默认为*true*。</p>
+		<p>材质是否受雾影响。默认为 *true*。</p>
 
 		<h3>[property:Boolean isSpriteMaterial]</h3>
 		<p>
-			Read-only flag to check if a given object is of type [name].
+			只读标志,用于检查给定对象是否属于 [name]。
 		</p>
 
 		<h3>[property:Texture map]</h3>

+ 22 - 2
docs/api/zh/scenes/Scene.html

@@ -34,7 +34,17 @@
 
 		<h3>[property:Float backgroundBlurriness]</h3>
 		<p>
-			Sets the blurriness of the background. Only influences environment maps assigned to [page:Scene.background]. Valid input is a float between *0* and *1*. Default is *0*.
+			设置背景的模糊度。仅影响分配给 [page:Scene.background] 的环境贴图。有效输入是介于 *0* 到 *1*。默认值为 *0*。
+		</p>
+
+		<h3>[property:Float backgroundIntensity]</h3>
+		<p>
+			减弱背景色。仅适用于背景纹理。默认值为 `1`。
+		</p>
+
+		<h3>[property:Euler backgroundRotation]</h3>
+		<p>
+			背景的旋转(以弧度为单位)。仅影响分配给 [page:Scene.background]。默认值为 `(0,0,0)`。
 		</p>
 
 		<h3>[property:Texture environment]</h3>
@@ -43,6 +53,16 @@
     然而,该属性不能够覆盖已存在的、已分配给 [page:MeshStandardMaterial.envMap] 的贴图。默认为null。
 		</p>
 
+		<h3>[property:Float environmentIntensity]</h3>
+		<p>
+			减弱环境色。仅影响指定给 [page:Scene.environment]。默认值为 `1`。
+		</p>
+
+		<h3>[property:Euler environmentRotation]</h3>
+		<p>
+			环境贴图的旋转(以弧度为单位)。仅在使用 [page:.environment] 时影响场景中的物理材质。默认值为 `(0,0,0)`。
+		</p>
+
 		<h3>[property:Fog fog]</h3>
 
 		<p>一个[page:Fog fog]实例定义了影响场景中的每个物体的雾的类型。默认值为null。
@@ -50,7 +70,7 @@
 
 		<h3>[property:Boolean isScene]</h3>
 		<p>
-			Read-only flag to check if a given object is of type [name].
+			只读标志用于检查给定的对象是否属于 [name] 类型。
 		</p>
 
 		<h3>[property:Material overrideMaterial]</h3>

+ 2 - 2
docs/examples/en/animations/MMDAnimationHelper.html

@@ -111,7 +111,7 @@
 		<p>A [page:WeakMap] which holds animation stuffs used in helper for objects added to helper. For example, you can access [page:AnimationMixer] for an added [page:SkinnedMesh] with "helper.objects.get( mesh ).mixer"</p>
 
 		<h3>[property:Function onBeforePhysics]</h3>
-		<p>An optional callback that is executed immediately before the physicis calculation for an [page:SkinnedMesh]. This function is called with the [page:SkinnedMesh].</p>
+		<p>An optional callback that is executed immediately before the physics calculation for an [page:SkinnedMesh]. This function is called with the [page:SkinnedMesh].</p>
 
 		<h2>Methods</h2>
 
@@ -130,7 +130,7 @@
 			<li>[page:Number delayTime] - Only for [page:Audio]. Default is 0.0.</li>
 		</ul>
 		<p>
-		Add an [page:SkinnedMesh], [page:Camera], or [page:Audio] to helper and setup animation. The anmation durations of added objects are synched.
+		Add an [page:SkinnedMesh], [page:Camera], or [page:Audio] to helper and setup animation. The animation durations of added objects are synched.
 		If camera/audio has already been added, it'll be replaced with a new one.
 		</p>
 

+ 1 - 1
docs/examples/en/controls/ArcballControls.html

@@ -106,7 +106,7 @@
 
 		<h3>[property:Boolean adjustNearFar]</h3>
 		<p>
-			If true, camera's near and far values will be adjusted every time zoom is performed trying to mantain the same visible portion
+			If true, camera's near and far values will be adjusted every time zoom is performed trying to maintain the same visible portion
 			given by initial near and far values ( [page:PerspectiveCamera] only ).
 			Default is false.
 		</p>

+ 30 - 0
docs/examples/en/controls/TransformControls.html

@@ -132,6 +132,36 @@
 			steps the 3D object should be translated. Default is `null`.
 		</p>
 
+		<h3>[property:Number minX]</h3>
+		<p>
+			The minimum allowed X position during translation. Default is `-Infinity`.
+		</p>
+
+		<h3>[property:Number maxX]</h3>
+		<p>
+			The maximum allowed X position during translation. Default is `Infinity`.
+		</p>
+
+		<h3>[property:Number minY]</h3>
+		<p>
+			The minimum allowed Y position during translation. Default is `-Infinity`.
+		</p>
+
+		<h3>[property:Number maxY]</h3>
+		<p>
+			The maximum allowed Y position during translation. Default is `Infinity`.
+		</p>
+
+		<h3>[property:Number minZ]</h3>
+		<p>
+			The minimum allowed Z position during translation. Default is `-Infinity`.
+		</p>
+
+		<h3>[property:Number maxZ]</h3>
+		<p>
+			The maximum allowed Z position during translation. Default is `Infinity`.
+		</p>
+
 		<h2>Methods</h2>
 
 		<p>See the base [page:Controls] class for common methods.</p>

+ 1 - 1
docs/examples/en/exporters/DRACOExporter.html

@@ -69,7 +69,7 @@
 			<li>decodeSpeed - int. Indicates how to tune the encoder regarding decode speed (0 gives better speed but worst quality). Default is 5</li>
 			<li>encodeSpeed - int. Indicates how to tune the encoder parameters (0 gives better speed but worst quality). Default is 5.</li>
 			<li>encoderMethod - int. Either sequential (very little compression) or Edgebreaker. Edgebreaker traverses the triangles of the mesh in a deterministic, spiral-like way which provides most of the benefits of this data format. Default is DRACOExporter.MESH_EDGEBREAKER_ENCODING.</li>
-			<li>quantization - Array of int. Indicates the presision of each type of data stored in the draco file in the order (POSITION, NORMAL, COLOR, TEX_COORD, GENERIC). Default is [ 16, 8, 8, 8, 8 ]</li>
+			<li>quantization - Array of int. Indicates the precision of each type of data stored in the draco file in the order (POSITION, NORMAL, COLOR, TEX_COORD, GENERIC). Default is [ 16, 8, 8, 8, 8 ]</li>
 			<li>exportUvs - bool. Default is true.</li>
 			<li>exportNormals - bool. Default is true.</li>
 			<li>exportColor - bool. Default is false.</li>

+ 2 - 2
docs/examples/en/geometries/TeapotGeometry.html

@@ -12,7 +12,7 @@
 		<h1>[name]</h1>
 
 		<p class="desc">
-			[name] tesselates the famous Utah teapot database by Martin Newell.
+			[name] tessellates the famous Utah teapot database by Martin Newell.
 		</p>
 
 		<h2>Import</h2>
@@ -38,7 +38,7 @@
 		<h2>Constructor</h2>
 
 		<h3>
-			[name]([param:Integer size], [param:Integer segments], [param:Boolean bottom], [param:Boolean lid], [param:Boolean body], 
+			[name]([param:Integer size], [param:Integer segments], [param:Boolean bottom], [param:Boolean lid], [param:Boolean body],
 			[param:Boolean fitLid], [param:Boolean blinn])
 		</h3>
 		<p>

+ 2 - 2
docs/examples/en/math/convexhull/ConvexHull.html

@@ -156,7 +156,7 @@
 			[page:Ray ray] - The given ray.<br />
 			[page:Vector3 target] - The target vector representing the intersection point.<br /><br />
 
-			Performs a ray intersection test with this convext hull. If no intersection is found, `null` is returned.
+			Performs a ray intersection test with this convex hull. If no intersection is found, `null` is returned.
 		</p>
 
 		<h3>[method:Boolean intersectsRay]( [param:Ray ray] )</h3>
@@ -210,7 +210,7 @@
 		<p>
 			[page:Object3D object] - [page:Object3D] to compute the convex hull of.<br /><br />
 
-			Computes the convex hull of an [page:Object3D] (including its children),accounting for the world transforms of both the object and its childrens.
+			Computes the convex hull of an [page:Object3D] (including its children),accounting for the world transforms of both the object and its children.
 		</p>
 
 		<h3>[method:this setFromPoints]( [param:Array points] )</h3>

+ 4 - 0
docs/manual/en/introduction/Color-management.html

@@ -165,6 +165,10 @@
 THREE.ColorManagement.enabled = true;
 	</code>
 
+	<p>
+		THREE.ColorManagement is enabled by default.
+	</p>
+
 	<ul>
 		<li>
 			<b>Materials, lights, and shaders:</b> Colors in materials, lights, and shaders store

+ 2 - 2
docs/manual/en/introduction/How-to-update-things.html

@@ -220,7 +220,7 @@ camera.updateProjectionMatrix();
 		<div>
 			<p>
 				`InstancedMesh` is a class for conveniently access instanced rendering in `three.js`. Certain library features like view frustum culling or
-				ray casting rely on up-to-date bounding volumes (bounding sphere and bounding box). Because of the way how `InstancedMesh` works, the class 
+				ray casting rely on up-to-date bounding volumes (bounding sphere and bounding box). Because of the way how `InstancedMesh` works, the class
 				has its own [page:InstancedMesh.boundingBox boundingBox] and [page:InstancedMesh.boundingSphere boundingSphere] properties that supersede
 				the bounding volumes on geometry level.
 			</p>
@@ -241,7 +241,7 @@ instancedMesh.computeBoundingSphere();
 				`SkinnedMesh` follows the same principles like `InstancedMesh` in context of bounding volumes. Meaning the class has its own version of
 				[page:SkinnedMesh.boundingBox boundingBox] and [page:SkinnedMesh.boundingSphere boundingSphere] to correctly enclose animated meshes.
 				When calling `computeBoundingBox()` and `computeBoundingSphere()`, the class computes the respective bounding volumes based on the current
-				bone tranformation (or in other words the current animation state).
+				bone transformation (or in other words the current animation state).
 			</p>
 		</div>
 

+ 4 - 4
docs/manual/ja/introduction/How-to-use-post-processing.html

@@ -62,8 +62,8 @@
 	<p>
 		composerが準備できたので、post-processingパスのチェーンを設定できるようになりました。
 		これらのパスはアプリケーションの最終的なビジュアルを出力することに責任を持ちます。
-		これらのパスは追加/挿入の順番で処理されます。In our example, the instance of `RenderPass`
-		is executed first, then the instance of `GlitchPass` and finally `OutputPass`。チェーンの中で最後の有効なpassが自動的に画面に描画されます。
+		これらのパスは追加/挿入の順番で処理されます。この例では、まず*RenderPass*のインスタンスが実行され、次に*GlitchPass*のインスタンスが実行され、最後に*OutputPass*が実行されます。
+		チェーンの中で最後の有効なpassが自動的に画面に描画されます。
 		passの設定は以下のように行います。
 	</p>
 
@@ -82,7 +82,7 @@
 		*RenderPass*は普通チェインのはじめにあります。
 		これはレンダリングされたシーンを次のpost-processingの入力とするためです。
 		*GlitchPass*は、これらのイメージをワイルドなglitch effectを適用するために使います。
-		 `OutputPass` is usually the last pass in the chain which performs sRGB color space conversion and optional tone mapping.
+		*OutputPass*は通常、連鎖の最後のパスで、sRGB カラースペースの変換とオプションのトーンマッピングを実行します。
 		実際に動いているものを見るために、[link:https://threejs.org/examples/webgl_postprocessing_glitch sample]を見てみましょう。
 	</p>
 
@@ -117,4 +117,4 @@
 
 </body>
 
-</html>
+</html>

+ 3 - 3
docs/manual/ko/introduction/How-to-dispose-of-objects.html

@@ -43,8 +43,8 @@
 	</p>
 
 	<p>
-        If you use an *ImageBitmap* as the texture's data source, you have to call [link:https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap/close ImageBitmap.close]() at the application level to dispose of all CPU-side resources.
-        An automated call of *ImageBitmap.close()* in [page:Texture.dispose]() is not possible, since the image bitmap becomes unusable, and the engine has no way of knowing if the image bitmap is used elsewhere.
+	만약 *ImageBitmap*을 텍스처의 데이터 소스로 사용할 경우, 애플리케이션 레벨에서 [link:https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap/close ImageBitmap.close]()를 호출하여 CPU 측 리소스를 모두 해제해야 합니다.
+	[page:Texture.dispose]()에서 *ImageBitmap.close()*를 자동으로 호출하는 것은 불가능한데, 이는 이미지 비트맵이 사용 불가능하게 되기 때문이며, 엔진은 해당 이미지 비트맵이 다른 곳에서 사용되고 있는지 여부를 알 수 없기 때문입니다.
 	</p>
 
 	<h2>렌더링 대상</h2>
@@ -59,7 +59,7 @@
 
 	<p>
         컨트롤러나 후기 처리 프로세스처럼 *dispose()* 메서드가 제공되어 내부 이벤트리스너나 렌더링 대상을 폐기하는 examples 폴더에서 가져온 것들이 있습니다.
-        일반적으로 API나 파일을 열람하고 *dispose()* 를 확인하는 것이 좋습니다. 만약 이 메서드가 존재한다면 당연히 그 메서드를 폐기 시에 사용해야 합니다.e it when cleaning things up.
+        일반적으로 API나 파일을 열람하고 *dispose()* 를 확인하는 것이 좋습니다. 만약 이 메서드가 존재한다면 당연히 그 메서드를 폐기 시에 사용해야 합니다.
 	</p>
 
 	<h2>FAQ</h2>

+ 36 - 0
docs/page.css

@@ -156,6 +156,10 @@ ul code {
 	margin: 16px 0;
 }
 
+code {
+	position: relative;
+}
+
 code.inline {
 	display: inline-block;
 	vertical-align: middle;
@@ -165,6 +169,32 @@ code.inline {
 	margin: 0;
 }
 
+.copy-btn {
+	cursor: pointer;
+	position: absolute;
+	top: 16px;
+	right: 16px;
+	width: 24px;
+	height: 24px;
+	background-color: transparent;
+	background-image: url('../files/ic_copy_grey_24dp.svg');
+	background-size: contain;
+	background-position: center;
+	background-repeat: no-repeat;
+	opacity: 0.9;
+	border: none;
+}
+
+.copy-btn:hover {
+	opacity: 1;
+}
+
+.copy-btn.copied {
+	pointer-events: none;
+	opacity: 1;
+	background-image: url('../files/ic_tick_green_24dp.svg');
+}
+
 table {
 	width: 100%;
 	border-collapse: collapse;
@@ -315,4 +345,10 @@ a.param:hover {
 		line-height: 28px;
 	}
 
+	.copy-btn {
+		top: 12px;
+		right: 8px;
+		width: 20px;
+		height: 20px;
+	}
 }

+ 34 - 2
docs/page.js

@@ -125,6 +125,34 @@ function onDocumentLoad() {
 
 	}
 
+	// create copy button for copying code snippets
+
+	function addCopyButton( element ) {
+
+		const copyButton = document.createElement( 'button' );
+		copyButton.className = 'copy-btn';
+
+		element.appendChild( copyButton );
+
+		copyButton.addEventListener( 'click', function () {
+
+			const codeContent = element.textContent;
+			navigator.clipboard.writeText( codeContent ).then( () => {
+
+				copyButton.classList.add( 'copied' );
+
+				setTimeout( () => {
+
+					copyButton.classList.remove( 'copied' );
+
+				}, 1000 );
+
+			} );
+
+		} );
+
+	}
+
 	const elements = document.getElementsByTagName( 'code' );
 
 	for ( let i = 0; i < elements.length; i ++ ) {
@@ -133,6 +161,12 @@ function onDocumentLoad() {
 
 		element.textContent = dedent( element.textContent );
 
+		if ( ! element.classList.contains( 'inline' ) ) {
+
+			addCopyButton( element );
+
+		}
+
 	}
 
 	// Edit button
@@ -176,8 +210,6 @@ function onDocumentLoad() {
 
 		}
 
-		prettyPrint(); // eslint-disable-line no-undef
-
 	};
 
 	document.head.appendChild( prettify );

+ 64 - 28
docs/prettify/prettify.js

@@ -1,28 +1,64 @@
-var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
-(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
-[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
-f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
-(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
-{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
-t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
-"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
-l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
-q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
-q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
-"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
-a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
-for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
-m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
-a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
-j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
-"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
-H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
-J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
-I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
-["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
-/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
-["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
-hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
-!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
-250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
-PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
+!function(){/*
+
+ Copyright (C) 2013 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ Copyright (C) 2006 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+(function(){function aa(g){function r(){try{L.doScroll("left")}catch(ba){k.setTimeout(r,50);return}x("poll")}function x(r){if("readystatechange"!=r.type||"complete"==z.readyState)("load"==r.type?k:z)[B](n+r.type,x,!1),!l&&(l=!0)&&g.call(k,r.type||r)}var X=z.addEventListener,l=!1,E=!0,v=X?"addEventListener":"attachEvent",B=X?"removeEventListener":"detachEvent",n=X?"":"on";if("complete"==z.readyState)g.call(k,"lazy");else{if(z.createEventObject&&L.doScroll){try{E=!k.frameElement}catch(ba){}E&&r()}z[v](n+
+"DOMContentLoaded",x,!1);z[v](n+"readystatechange",x,!1);k[v](n+"load",x,!1)}}function T(){U&&aa(function(){var g=M.length;ca(g?function(){for(var r=0;r<g;++r)(function(g){k.setTimeout(function(){k.exports[M[g]].apply(k,arguments)},0)})(r)}:void 0)})}for(var k=window,z=document,L=z.documentElement,N=z.head||z.getElementsByTagName("head")[0]||L,B="",F=z.getElementsByTagName("script"),l=F.length;0<=--l;){var O=F[l],Y=O.src.match(/^[^?#]*\/run_prettify\.js(\?[^#]*)?(?:#.*)?$/);if(Y){B=Y[1]||"";O.parentNode.removeChild(O);
+break}}var U=!0,H=[],P=[],M=[];B.replace(/[?&]([^&=]+)=([^&]+)/g,function(g,r,x){x=decodeURIComponent(x);r=decodeURIComponent(r);"autorun"==r?U=!/^[0fn]/i.test(x):"lang"==r?H.push(x):"skin"==r?P.push(x):"callback"==r&&M.push(x)});l=0;for(B=H.length;l<B;++l)(function(){var g=z.createElement("script");g.onload=g.onerror=g.onreadystatechange=function(){!g||g.readyState&&!/loaded|complete/.test(g.readyState)||(g.onerror=g.onload=g.onreadystatechange=null,--S,S||k.setTimeout(T,0),g.parentNode&&g.parentNode.removeChild(g),
+g=null)};g.type="text/javascript";g.src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/lang-"+encodeURIComponent(H[l])+".js";N.insertBefore(g,N.firstChild)})(H[l]);for(var S=H.length,F=[],l=0,B=P.length;l<B;++l)F.push("https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/skins/"+encodeURIComponent(P[l])+".css");F.push("https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/prettify.css");(function(g){function r(l){if(l!==x){var k=z.createElement("link");k.rel="stylesheet";
+k.type="text/css";l+1<x&&(k.error=k.onerror=function(){r(l+1)});k.href=g[l];N.appendChild(k)}}var x=g.length;r(0)})(F);var ca=function(){"undefined"!==typeof window&&(window.PR_SHOULD_USE_CONTINUATION=!0);var g;(function(){function r(a){function d(e){var a=e.charCodeAt(0);if(92!==a)return a;var c=e.charAt(1);return(a=k[c])?a:"0"<=c&&"7">=c?parseInt(e.substring(1),8):"u"===c||"x"===c?parseInt(e.substring(2),16):e.charCodeAt(1)}function f(e){if(32>e)return(16>e?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);
+return"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e}function c(e){var c=e.substring(1,e.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));e=[];var a="^"===c[0],b=["["];a&&b.push("^");for(var a=a?1:0,h=c.length;a<h;++a){var m=c[a];if(/\\[bdsw]/i.test(m))b.push(m);else{var m=d(m),p;a+2<h&&"-"===c[a+1]?(p=d(c[a+2]),a+=2):p=m;e.push([m,p]);65>p||122<m||(65>p||90<m||e.push([Math.max(65,m)|32,Math.min(p,90)|32]),97>p||122<m||
+e.push([Math.max(97,m)&-33,Math.min(p,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});c=[];h=[];for(a=0;a<e.length;++a)m=e[a],m[0]<=h[1]+1?h[1]=Math.max(h[1],m[1]):c.push(h=m);for(a=0;a<c.length;++a)m=c[a],b.push(f(m[0])),m[1]>m[0]&&(m[1]+1>m[0]&&b.push("-"),b.push(f(m[1])));b.push("]");return b.join("")}function g(e){for(var a=e.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)",
+"g")),b=a.length,d=[],h=0,m=0;h<b;++h){var p=a[h];"("===p?++m:"\\"===p.charAt(0)&&(p=+p.substring(1))&&(p<=m?d[p]=-1:a[h]=f(p))}for(h=1;h<d.length;++h)-1===d[h]&&(d[h]=++r);for(m=h=0;h<b;++h)p=a[h],"("===p?(++m,d[m]||(a[h]="(?:")):"\\"===p.charAt(0)&&(p=+p.substring(1))&&p<=m&&(a[h]="\\"+d[p]);for(h=0;h<b;++h)"^"===a[h]&&"^"!==a[h+1]&&(a[h]="");if(e.ignoreCase&&A)for(h=0;h<b;++h)p=a[h],e=p.charAt(0),2<=p.length&&"["===e?a[h]=c(p):"\\"!==e&&(a[h]=p.replace(/[a-zA-Z]/g,function(a){a=a.charCodeAt(0);
+return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var r=0,A=!1,q=!1,I=0,b=a.length;I<b;++I){var t=a[I];if(t.ignoreCase)q=!0;else if(/[a-z]/i.test(t.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){A=!0;q=!1;break}}for(var k={b:8,t:9,n:10,v:11,f:12,r:13},u=[],I=0,b=a.length;I<b;++I){t=a[I];if(t.global||t.multiline)throw Error(""+t);u.push("(?:"+g(t)+")")}return new RegExp(u.join("|"),q?"gi":"g")}function l(a,d){function f(a){var b=a.nodeType;if(1==b){if(!c.test(a.className)){for(b=
+a.firstChild;b;b=b.nextSibling)f(b);b=a.nodeName.toLowerCase();if("br"===b||"li"===b)g[q]="\n",A[q<<1]=r++,A[q++<<1|1]=a}}else if(3==b||4==b)b=a.nodeValue,b.length&&(b=d?b.replace(/\r\n?/g,"\n"):b.replace(/[ \t\r\n]+/g," "),g[q]=b,A[q<<1]=r,r+=b.length,A[q++<<1|1]=a)}var c=/(?:^|\s)nocode(?:\s|$)/,g=[],r=0,A=[],q=0;f(a);return{a:g.join("").replace(/\n$/,""),c:A}}function k(a,d,f,c,g){f&&(a={h:a,l:1,j:null,m:null,a:f,c:null,i:d,g:null},c(a),g.push.apply(g,a.g))}function z(a){for(var d=void 0,f=a.firstChild;f;f=
+f.nextSibling)var c=f.nodeType,d=1===c?d?a:f:3===c?S.test(f.nodeValue)?a:d:d;return d===a?void 0:d}function E(a,d){function f(a){for(var q=a.i,r=a.h,b=[q,"pln"],t=0,A=a.a.match(g)||[],u={},e=0,l=A.length;e<l;++e){var D=A[e],w=u[D],h=void 0,m;if("string"===typeof w)m=!1;else{var p=c[D.charAt(0)];if(p)h=D.match(p[1]),w=p[0];else{for(m=0;m<n;++m)if(p=d[m],h=D.match(p[1])){w=p[0];break}h||(w="pln")}!(m=5<=w.length&&"lang-"===w.substring(0,5))||h&&"string"===typeof h[1]||(m=!1,w="src");m||(u[D]=w)}p=t;
+t+=D.length;if(m){m=h[1];var C=D.indexOf(m),G=C+m.length;h[2]&&(G=D.length-h[2].length,C=G-m.length);w=w.substring(5);k(r,q+p,D.substring(0,C),f,b);k(r,q+p+C,m,F(w,m),b);k(r,q+p+G,D.substring(G),f,b)}else b.push(q+p,w)}a.g=b}var c={},g;(function(){for(var f=a.concat(d),q=[],k={},b=0,t=f.length;b<t;++b){var n=f[b],u=n[3];if(u)for(var e=u.length;0<=--e;)c[u.charAt(e)]=n;n=n[1];u=""+n;k.hasOwnProperty(u)||(q.push(n),k[u]=null)}q.push(/[\0-\uffff]/);g=r(q)})();var n=d.length;return f}function v(a){var d=
+[],f=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"]):d.push(["str",/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"]);a.verbatimStrings&&
+f.push(["str",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);var c=a.hashComments;c&&(a.cStyleComments?(1<c?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"]),f.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])):d.push(["com",/^#[^\r\n]*/,null,"#"]));a.cStyleComments&&(f.push(["com",/^\/\/[^\r\n]*/,null]),f.push(["com",/^\/\*[\s\S]*?(?:\*\/|$)/,
+null]));if(c=a.regexLiterals){var g=(c=1<c?"":"\n\r")?".":"[\\S\\s]";f.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+c+"])(?:[^/\\x5B\\x5C"+c+"]|\\x5C"+g+"|\\x5B(?:[^\\x5C\\x5D"+c+"]|\\x5C"+g+")*(?:\\x5D|$))+/")+")")])}(c=a.types)&&f.push(["typ",c]);c=(""+a.keywords).replace(/^ | $/g,"");c.length&&f.push(["kwd",
+new RegExp("^(?:"+c.replace(/[\s,]+/g,"|")+")\\b"),null]);d.push(["pln",/^\s+/,null," \r\n\t\u00a0"]);c="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(c+="(?!s*/)");f.push(["lit",/^@[a-z_$][a-z_$@0-9]*/i,null],["typ",/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],["pln",/^[a-z_$][a-z_$@0-9]*/i,null],["lit",/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],["pln",/^\\[\s\S]?/,null],["pun",new RegExp(c),null]);return E(d,f)}function B(a,d,f){function c(a){var b=
+a.nodeType;if(1==b&&!r.test(a.className))if("br"===a.nodeName.toLowerCase())g(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)c(a);else if((3==b||4==b)&&f){var e=a.nodeValue,d=e.match(n);d&&(b=e.substring(0,d.index),a.nodeValue=b,(e=e.substring(d.index+d[0].length))&&a.parentNode.insertBefore(q.createTextNode(e),a.nextSibling),g(a),b||a.parentNode.removeChild(a))}}function g(a){function c(a,b){var e=b?a.cloneNode(!1):a,p=a.parentNode;if(p){var p=c(p,1),d=a.nextSibling;
+p.appendChild(e);for(var f=d;f;f=d)d=f.nextSibling,p.appendChild(f)}return e}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;a=c(a.nextSibling,0);for(var e;(e=a.parentNode)&&1===e.nodeType;)a=e;b.push(a)}for(var r=/(?:^|\s)nocode(?:\s|$)/,n=/\r\n?|\n/,q=a.ownerDocument,k=q.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var b=[k],t=0;t<b.length;++t)c(b[t]);d===(d|0)&&b[0].setAttribute("value",d);var l=q.createElement("ol");l.className="linenums";d=Math.max(0,d-1|0)||0;for(var t=
+0,u=b.length;t<u;++t)k=b[t],k.className="L"+(t+d)%10,k.firstChild||k.appendChild(q.createTextNode("\u00a0")),l.appendChild(k);a.appendChild(l)}function n(a,d){for(var f=d.length;0<=--f;){var c=d[f];V.hasOwnProperty(c)?Q.console&&console.warn("cannot override language handler %s",c):V[c]=a}}function F(a,d){a&&V.hasOwnProperty(a)||(a=/^\s*</.test(d)?"default-markup":"default-code");return V[a]}function H(a){var d=a.j;try{var f=l(a.h,a.l),c=f.a;a.a=c;a.c=f.c;a.i=0;F(d,c)(a);var g=/\bMSIE\s(\d+)/.exec(navigator.userAgent),
+g=g&&8>=+g[1],d=/\n/g,r=a.a,k=r.length,f=0,q=a.c,n=q.length,c=0,b=a.g,t=b.length,v=0;b[t]=k;var u,e;for(e=u=0;e<t;)b[e]!==b[e+2]?(b[u++]=b[e++],b[u++]=b[e++]):e+=2;t=u;for(e=u=0;e<t;){for(var x=b[e],z=b[e+1],w=e+2;w+2<=t&&b[w+1]===z;)w+=2;b[u++]=x;b[u++]=z;e=w}b.length=u;var h=a.h;a="";h&&(a=h.style.display,h.style.display="none");try{for(;c<n;){var m=q[c+2]||k,p=b[v+2]||k,w=Math.min(m,p),C=q[c+1],G;if(1!==C.nodeType&&(G=r.substring(f,w))){g&&(G=G.replace(d,"\r"));C.nodeValue=G;var Z=C.ownerDocument,
+W=Z.createElement("span");W.className=b[v+1];var B=C.parentNode;B.replaceChild(W,C);W.appendChild(C);f<m&&(q[c+1]=C=Z.createTextNode(r.substring(w,m)),B.insertBefore(C,W.nextSibling))}f=w;f>=m&&(c+=2);f>=p&&(v+=2)}}finally{h&&(h.style.display=a)}}catch(y){Q.console&&console.log(y&&y.stack||y)}}var Q="undefined"!==typeof window?window:{},J=["break,continue,do,else,for,if,return,while"],K=[[J,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],R=[K,"alignas,alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],L=[K,"abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
+M=[K,"abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface,internal,into,is,join,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,value,var,virtual,where,yield"],K=[K,"abstract,async,await,constructor,debugger,enum,eval,export,from,function,get,import,implements,instanceof,interface,let,null,of,set,undefined,var,with,yield,Infinity,NaN"],
+N=[J,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],O=[J,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],J=[J,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],P=/^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
+S=/\S/,T=v({keywords:[R,M,L,K,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",N,O,J],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),V={};n(T,["default-code"]);n(E([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",
+/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),"default-markup htm html mxml xhtml xml xsl".split(" "));n(E([["pln",/^[\s]+/,null," \t\r\n"],["atv",/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
+["pun",/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);n(E([],[["atv",/^[\s\S]+/]]),["uq.val"]);n(v({keywords:R,hashComments:!0,cStyleComments:!0,types:P}),"c cc cpp cxx cyc m".split(" "));n(v({keywords:"null,true,false"}),["json"]);n(v({keywords:M,hashComments:!0,cStyleComments:!0,
+verbatimStrings:!0,types:P}),["cs"]);n(v({keywords:L,cStyleComments:!0}),["java"]);n(v({keywords:J,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);n(v({keywords:N,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);n(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),
+["perl","pl","pm"]);n(v({keywords:O,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);n(v({keywords:K,cStyleComments:!0,regexLiterals:!0}),["javascript","js","ts","typescript"]);n(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);n(E([],[["str",/^[\s\S]+/]]),
+["regex"]);var U=Q.PR={createSimpleLexer:E,registerLangHandler:n,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:function(a,d,f){f=f||!1;d=d||null;var c=document.createElement("div");c.innerHTML="<pre>"+a+"</pre>";c=c.firstChild;f&&B(c,f,!0);H({j:d,m:f,h:c,l:1,a:null,i:null,c:null,g:null});
+return c.innerHTML},prettyPrint:g=function(a,d){function f(){for(var c=Q.PR_SHOULD_USE_CONTINUATION?b.now()+250:Infinity;t<r.length&&b.now()<c;t++){for(var d=r[t],k=h,n=d;n=n.previousSibling;){var q=n.nodeType,l=(7===q||8===q)&&n.nodeValue;if(l?!/^\??prettify\b/.test(l):3!==q||/\S/.test(n.nodeValue))break;if(l){k={};l.replace(/\b(\w+)=([\w:.%+-]+)/g,function(a,b,c){k[b]=c});break}}n=d.className;if((k!==h||u.test(n))&&!e.test(n)){q=!1;for(l=d.parentNode;l;l=l.parentNode)if(w.test(l.tagName)&&l.className&&
+u.test(l.className)){q=!0;break}if(!q){d.className+=" prettyprinted";q=k.lang;if(!q){var q=n.match(v),A;!q&&(A=z(d))&&D.test(A.tagName)&&(q=A.className.match(v));q&&(q=q[1])}if(x.test(d.tagName))l=1;else var l=d.currentStyle,y=g.defaultView,l=(l=l?l.whiteSpace:y&&y.getComputedStyle?y.getComputedStyle(d,null).getPropertyValue("white-space"):0)&&"pre"===l.substring(0,3);y=k.linenums;(y="true"===y||+y)||(y=(y=n.match(/\blinenums\b(?::(\d+))?/))?y[1]&&y[1].length?+y[1]:!0:!1);y&&B(d,y,l);H({j:q,h:d,m:y,
+l:l,a:null,i:null,c:null,g:null})}}}t<r.length?Q.setTimeout(f,250):"function"===typeof a&&a()}for(var c=d||document.body,g=c.ownerDocument||document,c=[c.getElementsByTagName("pre"),c.getElementsByTagName("code"),c.getElementsByTagName("xmp")],r=[],k=0;k<c.length;++k)for(var n=0,l=c[k].length;n<l;++n)r.push(c[k][n]);var c=null,b=Date;b.now||(b={now:function(){return+new Date}});var t=0,v=/\blang(?:uage)?-([\w.]+)(?!\S)/,u=/\bprettyprint\b/,e=/\bprettyprinted\b/,x=/pre|xmp/i,D=/^code$/i,w=/^(?:pre|code|xmp)$/i,
+h={};f()}},R=Q.define;"function"===typeof R&&R.amd&&R("google-code-prettify",[],function(){return U})})();return g}();S||k.setTimeout(T,0)})();}()

+ 13 - 2
examples/files.json

@@ -8,7 +8,6 @@
 		"webgl_animation_multiple",
 		"webgl_camera",
 		"webgl_camera_array",
-		"webgl_camera_cinematic",
 		"webgl_camera_logarithmicdepthbuffer",
 		"webgl_clipping",
 		"webgl_clipping_advanced",
@@ -279,7 +278,6 @@
 		"webgl_materials_modified",
 		"webgl_multiple_rendertargets",
 		"webgl_multisampled_renderbuffers",
-		"webgl_raymarching_reflect",
 		"webgl_rendertarget_texture2darray",
 		"webgl_shadowmap_csm",
 		"webgl_shadowmap_pcss",
@@ -328,6 +326,7 @@
 		"webgpu_equirectangular",
 		"webgpu_instance_mesh",
 		"webgpu_instance_points",
+		"webgpu_instance_sprites",
 		"webgpu_instance_uniform",
 		"webgpu_instancing_morph",
 		"webgpu_lensflares",
@@ -338,6 +337,8 @@
 		"webgpu_lights_phong",
 		"webgpu_lights_rectarealight",
 		"webgpu_lights_selective",
+		"webgpu_lights_tiled",
+		"webgpu_lines_fat_wireframe",
 		"webgpu_lines_fat",
 		"webgpu_loader_gltf",
 		"webgpu_loader_gltf_anisotropy",
@@ -348,9 +349,11 @@
 		"webgpu_loader_gltf_transmission",
 		"webgpu_loader_materialx",
 		"webgpu_materials",
+		"webgpu_materials_alphahash",
 		"webgpu_materials_arrays",
 		"webgpu_materials_basic",
 		"webgpu_materials_displacementmap",
+		"webgpu_materials_envmaps_bpcem",
 		"webgpu_materials_envmaps",
 		"webgpu_materials_lightmap",
 		"webgpu_materials_matcap",
@@ -390,10 +393,15 @@
 		"webgpu_postprocessing_dof",
 		"webgpu_postprocessing_pixel",
 		"webgpu_postprocessing_fxaa",
+		"webgpu_postprocessing_lensflare",
 		"webgpu_postprocessing_masking",
 		"webgpu_postprocessing_motion_blur",
+		"webgpu_postprocessing_outline",
+		"webgpu_postprocessing_smaa",
 		"webgpu_postprocessing_sobel",
 		"webgpu_postprocessing_ssaa",
+		"webgpu_postprocessing_ssr",
+		"webgpu_postprocessing_traa",
 		"webgpu_postprocessing_transition",
 		"webgpu_postprocessing",
 		"webgpu_procedural_texture",
@@ -403,7 +411,9 @@
 		"webgpu_sandbox",
 		"webgpu_shadertoy",
 		"webgpu_shadowmap",
+		"webgpu_shadowmap_csm",
 		"webgpu_shadowmap_opacity",
+		"webgpu_shadowmap_progressive",
 		"webgpu_shadowmap_vsm",
 		"webgpu_skinning",
 		"webgpu_skinning_instancing",
@@ -501,6 +511,7 @@
 		"misc_exporter_stl",
 		"misc_exporter_usdz",
 		"misc_exporter_exr",
+		"misc_exporter_ktx2",
 		"misc_lookat"
 	],
 	"css2d": [

+ 3 - 3
examples/jsm/Addons.js

@@ -3,8 +3,6 @@ export * from './animation/CCDIKSolver.js';
 export * from './animation/MMDAnimationHelper.js';
 export * from './animation/MMDPhysics.js';
 
-export * from './cameras/CinematicCamera.js';
-
 export { default as WebGL } from './capabilities/WebGL.js';
 
 export * from './controls/ArcballControls.js';
@@ -131,6 +129,8 @@ export * from './loaders/VTKLoader.js';
 export * from './loaders/XYZLoader.js';
 
 export * from './materials/MeshGouraudMaterial.js';
+export * from './materials/LDrawConditionalLineMaterial.js';
+export * from './materials/MeshPostProcessingMaterial.js';
 
 export * from './math/Capsule.js';
 export * from './math/ColorConverter.js';
@@ -274,7 +274,7 @@ export * as SceneUtils from './utils/SceneUtils.js';
 export * from './utils/ShadowMapViewer.js';
 export * as SkeletonUtils from './utils/SkeletonUtils.js';
 export * as SortUtils from './utils/SortUtils.js';
-export * from './utils/TextureUtils.js';
+export * from './utils/WebGLTextureUtils.js';
 export * from './utils/UVsDebug.js';
 export * from './utils/WorkerPool.js';
 

+ 2 - 0
examples/jsm/animation/MMDAnimationHelper.js

@@ -61,6 +61,8 @@ class MMDAnimationHelper {
 		this.sharedPhysics = false;
 		this.masterPhysics = null;
 
+		console.warn( 'THREE.MMDAnimationHelper: The module has been deprecated and will be removed with r172. Please migrate to https://github.com/takahirox/three-mmd-loader instead.' );
+
 	}
 
 	/**

+ 2 - 0
examples/jsm/animation/MMDPhysics.js

@@ -68,6 +68,8 @@ class MMDPhysics {
 
 		this._init( mesh, rigidBodyParams, constraintParams );
 
+		console.warn( 'THREE.MMDPhysics: The module has been deprecated and will be removed with r172. Please migrate to https://github.com/takahirox/three-mmd-loader instead.' );
+
 	}
 
 	/**

+ 0 - 208
examples/jsm/cameras/CinematicCamera.js

@@ -1,208 +0,0 @@
-import {
-	Mesh,
-	OrthographicCamera,
-	PerspectiveCamera,
-	PlaneGeometry,
-	Scene,
-	ShaderMaterial,
-	UniformsUtils,
-	WebGLRenderTarget
-} from 'three';
-
-import { BokehShader, BokehDepthShader } from '../shaders/BokehShader2.js';
-
-class CinematicCamera extends PerspectiveCamera {
-
-	constructor( fov, aspect, near, far ) {
-
-		super( fov, aspect, near, far );
-
-		this.type = 'CinematicCamera';
-
-		this.postprocessing = { enabled: true };
-		this.shaderSettings = {
-			rings: 3,
-			samples: 4
-		};
-
-		const depthShader = BokehDepthShader;
-
-		this.materialDepth = new ShaderMaterial( {
-			uniforms: depthShader.uniforms,
-			vertexShader: depthShader.vertexShader,
-			fragmentShader: depthShader.fragmentShader
-		} );
-
-		this.materialDepth.uniforms[ 'mNear' ].value = near;
-		this.materialDepth.uniforms[ 'mFar' ].value = far;
-
-		// In case of cinematicCamera, having a default lens set is important
-		this.setLens();
-
-		this.initPostProcessing();
-
-	}
-
-	// providing fnumber and coc(Circle of Confusion) as extra arguments
-	// In case of cinematicCamera, having a default lens set is important
-	// if fnumber and coc are not provided, cinematicCamera tries to act as a basic PerspectiveCamera
-	setLens( focalLength = 35, filmGauge = 35, fNumber = 8, coc = 0.019 ) {
-
-		this.filmGauge = filmGauge;
-
-		this.setFocalLength( focalLength );
-
-		this.fNumber = fNumber;
-		this.coc = coc;
-
-		// fNumber is focalLength by aperture
-		this.aperture = focalLength / this.fNumber;
-
-		// hyperFocal is required to calculate depthOfField when a lens tries to focus at a distance with given fNumber and focalLength
-		this.hyperFocal = ( focalLength * focalLength ) / ( this.aperture * this.coc );
-
-	}
-
-	linearize( depth ) {
-
-		const zfar = this.far;
-		const znear = this.near;
-		return - zfar * znear / ( depth * ( zfar - znear ) - zfar );
-
-	}
-
-	smoothstep( near, far, depth ) {
-
-		const x = this.saturate( ( depth - near ) / ( far - near ) );
-		return x * x * ( 3 - 2 * x );
-
-	}
-
-	saturate( x ) {
-
-		return Math.max( 0, Math.min( 1, x ) );
-
-	}
-
-	// function for focusing at a distance from the camera
-	focusAt( focusDistance = 20 ) {
-
-		const focalLength = this.getFocalLength();
-
-		// distance from the camera (normal to frustrum) to focus on
-		this.focus = focusDistance;
-
-		// the nearest point from the camera which is in focus (unused)
-		this.nearPoint = ( this.hyperFocal * this.focus ) / ( this.hyperFocal + ( this.focus - focalLength ) );
-
-		// the farthest point from the camera which is in focus (unused)
-		this.farPoint = ( this.hyperFocal * this.focus ) / ( this.hyperFocal - ( this.focus - focalLength ) );
-
-		// the gap or width of the space in which is everything is in focus (unused)
-		this.depthOfField = this.farPoint - this.nearPoint;
-
-		// Considering minimum distance of focus for a standard lens (unused)
-		if ( this.depthOfField < 0 ) this.depthOfField = 0;
-
-		this.sdistance = this.smoothstep( this.near, this.far, this.focus );
-
-		this.ldistance = this.linearize( 1 -	this.sdistance );
-
-		this.postprocessing.bokeh_uniforms[ 'focalDepth' ].value = this.ldistance;
-
-	}
-
-	initPostProcessing() {
-
-		if ( this.postprocessing.enabled ) {
-
-			this.postprocessing.scene = new Scene();
-
-			this.postprocessing.camera = new OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2,	window.innerHeight / 2, window.innerHeight / - 2, - 10000, 10000 );
-
-			this.postprocessing.scene.add( this.postprocessing.camera );
-
-			this.postprocessing.rtTextureDepth = new WebGLRenderTarget( window.innerWidth, window.innerHeight );
-			this.postprocessing.rtTextureColor = new WebGLRenderTarget( window.innerWidth, window.innerHeight );
-
-			const bokeh_shader = BokehShader;
-
-			this.postprocessing.bokeh_uniforms = UniformsUtils.clone( bokeh_shader.uniforms );
-
-			this.postprocessing.bokeh_uniforms[ 'tColor' ].value = this.postprocessing.rtTextureColor.texture;
-			this.postprocessing.bokeh_uniforms[ 'tDepth' ].value = this.postprocessing.rtTextureDepth.texture;
-
-			this.postprocessing.bokeh_uniforms[ 'manualdof' ].value = 0;
-			this.postprocessing.bokeh_uniforms[ 'shaderFocus' ].value = 0;
-
-			this.postprocessing.bokeh_uniforms[ 'fstop' ].value = 2.8;
-
-			this.postprocessing.bokeh_uniforms[ 'showFocus' ].value = 1;
-
-			this.postprocessing.bokeh_uniforms[ 'focalDepth' ].value = 0.1;
-
-			//console.log( this.postprocessing.bokeh_uniforms[ "focalDepth" ].value );
-
-			this.postprocessing.bokeh_uniforms[ 'znear' ].value = this.near;
-			this.postprocessing.bokeh_uniforms[ 'zfar' ].value = this.near;
-
-
-			this.postprocessing.bokeh_uniforms[ 'textureWidth' ].value = window.innerWidth;
-
-			this.postprocessing.bokeh_uniforms[ 'textureHeight' ].value = window.innerHeight;
-
-			this.postprocessing.materialBokeh = new ShaderMaterial( {
-				uniforms: this.postprocessing.bokeh_uniforms,
-				vertexShader: bokeh_shader.vertexShader,
-				fragmentShader: bokeh_shader.fragmentShader,
-				defines: {
-					RINGS: this.shaderSettings.rings,
-					SAMPLES: this.shaderSettings.samples,
-					DEPTH_PACKING: 1
-				}
-			} );
-
-			this.postprocessing.quad = new Mesh( new PlaneGeometry( window.innerWidth, window.innerHeight ), this.postprocessing.materialBokeh );
-			this.postprocessing.quad.position.z = - 500;
-			this.postprocessing.scene.add( this.postprocessing.quad );
-
-		}
-
-	}
-
-	renderCinematic( scene, renderer ) {
-
-		if ( this.postprocessing.enabled ) {
-
-			const currentRenderTarget = renderer.getRenderTarget();
-
-			renderer.clear();
-
-			// Render scene into texture
-
-			scene.overrideMaterial = null;
-			renderer.setRenderTarget( this.postprocessing.rtTextureColor );
-			renderer.clear();
-			renderer.render( scene, this );
-
-			// Render depth into texture
-
-			scene.overrideMaterial = this.materialDepth;
-			renderer.setRenderTarget( this.postprocessing.rtTextureDepth );
-			renderer.clear();
-			renderer.render( scene, this );
-
-			// Render bokeh composite
-
-			renderer.setRenderTarget( null );
-			renderer.render( this.postprocessing.scene, this.postprocessing.camera );
-
-			renderer.setRenderTarget( currentRenderTarget );
-
-		}
-
-	}
-
-}
-
-export { CinematicCamera };

+ 22 - 6
examples/jsm/controls/TransformControls.js

@@ -110,6 +110,12 @@ class TransformControls extends Controls {
 		defineProperty( 'showX', true );
 		defineProperty( 'showY', true );
 		defineProperty( 'showZ', true );
+		defineProperty( 'minX', - Infinity );
+		defineProperty( 'maxX', Infinity );
+		defineProperty( 'minY', - Infinity );
+		defineProperty( 'maxY', Infinity );
+		defineProperty( 'minZ', - Infinity );
+		defineProperty( 'maxZ', Infinity );
 
 		// Reusable utility variables
 
@@ -372,6 +378,10 @@ class TransformControls extends Controls {
 
 			}
 
+			object.position.x = Math.max( this.minX, Math.min( this.maxX, object.position.x ) );
+			object.position.y = Math.max( this.minY, Math.min( this.maxY, object.position.y ) );
+			object.position.z = Math.max( this.minZ, Math.min( this.maxZ, object.position.z ) );
+
 		} else if ( mode === 'scale' ) {
 
 			if ( axis.search( 'XYZ' ) !== - 1 ) {
@@ -536,12 +546,7 @@ class TransformControls extends Controls {
 
 		this.disconnect();
 
-		this.traverse( function ( child ) {
-
-			if ( child.geometry ) child.geometry.dispose();
-			if ( child.material ) child.material.dispose();
-
-		} );
+		this._root.dispose();
 
 	}
 
@@ -811,6 +816,17 @@ class TransformControlsRoot extends Object3D {
 
 	}
 
+	dispose() {
+
+		this.traverse( function ( child ) {
+
+			if ( child.geometry ) child.geometry.dispose();
+			if ( child.material ) child.material.dispose();
+
+		} );
+
+	}
+
 }
 
 class TransformControlsGizmo extends Object3D {

+ 2 - 2
examples/jsm/csm/CSM.js

@@ -11,7 +11,7 @@ import { CSMFrustum } from './CSMFrustum.js';
 import { CSMShader } from './CSMShader.js';
 
 const _cameraToLightMatrix = new Matrix4();
-const _lightSpaceFrustum = new CSMFrustum();
+const _lightSpaceFrustum = new CSMFrustum( { webGL: true } );
 const _center = new Vector3();
 const _bbox = new Box3();
 const _uniformArray = [];
@@ -38,7 +38,7 @@ export class CSM {
 		this.lightMargin = data.lightMargin || 200;
 		this.customSplitsCallback = data.customSplitsCallback;
 		this.fade = false;
-		this.mainFrustum = new CSMFrustum();
+		this.mainFrustum = new CSMFrustum( { webGL: true } );
 		this.frustums = [];
 		this.breaks = [];
 

+ 7 - 4
examples/jsm/csm/CSMFrustum.js

@@ -8,6 +8,8 @@ class CSMFrustum {
 
 		data = data || {};
 
+		this.zNear = data.webGL === true ? - 1 : 0;
+
 		this.vertices = {
 			near: [
 				new Vector3(),
@@ -33,6 +35,7 @@ class CSMFrustum {
 
 	setFromProjectionMatrix( projectionMatrix, maxFar ) {
 
+		const zNear = this.zNear;
 		const isOrthographic = projectionMatrix.elements[ 2 * 4 + 3 ] === 0;
 
 		inverseProjectionMatrix.copy( projectionMatrix ).invert();
@@ -42,10 +45,10 @@ class CSMFrustum {
 		// 2 --- 1
 		// clip space spans from [-1, 1]
 
-		this.vertices.near[ 0 ].set( 1, 1, - 1 );
-		this.vertices.near[ 1 ].set( 1, - 1, - 1 );
-		this.vertices.near[ 2 ].set( - 1, - 1, - 1 );
-		this.vertices.near[ 3 ].set( - 1, 1, - 1 );
+		this.vertices.near[ 0 ].set( 1, 1, zNear );
+		this.vertices.near[ 1 ].set( 1, - 1, zNear );
+		this.vertices.near[ 2 ].set( - 1, - 1, zNear );
+		this.vertices.near[ 3 ].set( - 1, 1, zNear );
 		this.vertices.near.forEach( function ( v ) {
 
 			v.applyMatrix4( inverseProjectionMatrix );

+ 2 - 0
examples/jsm/csm/CSMHelper.js

@@ -78,6 +78,8 @@ class CSMHelper extends Group {
 		const cascadePlanes = this.cascadePlanes;
 		const shadowLines = this.shadowLines;
 
+		if ( camera === null ) return;
+
 		this.position.copy( camera.position );
 		this.quaternion.copy( camera.quaternion );
 		this.scale.copy( camera.scale );

+ 435 - 0
examples/jsm/csm/CSMShadowNode.js

@@ -0,0 +1,435 @@
+import {
+	Vector2,
+	Vector3,
+	MathUtils,
+	Matrix4,
+	Box3,
+	Object3D,
+	WebGLCoordinateSystem
+} from 'three';
+
+import { CSMFrustum } from './CSMFrustum.js';
+import { viewZToOrthographicDepth, reference, uniform, float, vec4, vec2, If, Fn, min, renderGroup, positionView, Node, NodeUpdateType, shadow } from 'three/tsl';
+
+const _cameraToLightMatrix = new Matrix4();
+const _lightSpaceFrustum = new CSMFrustum();
+const _center = new Vector3();
+const _bbox = new Box3();
+const _uniformArray = [];
+const _logArray = [];
+const _lightDirection = new Vector3();
+const _lightOrientationMatrix = new Matrix4();
+const _lightOrientationMatrixInverse = new Matrix4();
+const _up = new Vector3( 0, 1, 0 );
+
+class LwLight extends Object3D {
+
+	constructor() {
+
+		super();
+
+		this.target = new Object3D();
+
+	}
+
+}
+
+class CSMShadowNode extends Node {
+
+	constructor( light, data = {} ) {
+
+		super();
+
+		this.light = light;
+		this.camera = null;
+		this.cascades = data.cascades || 3;
+		this.maxFar = data.maxFar || 100000;
+		this.mode = data.mode || 'practical';
+		this.lightMargin = data.lightMargin || 200;
+		this.customSplitsCallback = data.customSplitsCallback;
+
+		this.fade = false;
+
+		this.breaks = [];
+
+		this._cascades = [];
+		this.mainFrustum = null;
+		this.frustums = [];
+		this.updateBeforeType = NodeUpdateType.FRAME;
+
+		this.lights = [];
+
+		this._shadowNodes = [];
+
+	}
+
+	init( { camera, renderer } ) {
+
+		this.camera = camera;
+
+		const data = { webGL: renderer.coordinateSystem === WebGLCoordinateSystem };
+		this.mainFrustum = new CSMFrustum( data );
+
+		const light = this.light;
+		const parent = light.parent;
+
+		for ( let i = 0; i < this.cascades; i ++ ) {
+
+			const lwLight = new LwLight();
+			const lShadow = light.shadow.clone();
+			lShadow.bias = lShadow.bias * ( i + 1 );
+
+			this.lights.push( lwLight );
+
+			parent.add( lwLight );
+			parent.add( lwLight.target );
+
+			lwLight.shadow = lShadow;
+
+			this._shadowNodes.push( shadow( lwLight, lShadow ) );
+
+			this._cascades.push( new Vector2() );
+
+		}
+
+		this.updateFrustums();
+
+	}
+
+	initCascades() {
+
+		const camera = this.camera;
+		camera.updateProjectionMatrix();
+
+		this.mainFrustum.setFromProjectionMatrix( camera.projectionMatrix, this.maxFar );
+		this.mainFrustum.split( this.breaks, this.frustums );
+
+	}
+
+	getBreaks() {
+
+		const camera = this.camera;
+		const far = Math.min( camera.far, this.maxFar );
+
+		this.breaks.length = 0;
+
+		switch ( this.mode ) {
+
+			case 'uniform':
+				uniformSplit( this.cascades, camera.near, far, this.breaks );
+				break;
+
+			case 'logarithmic':
+				logarithmicSplit( this.cascades, camera.near, far, this.breaks );
+				break;
+
+			case 'practical':
+				practicalSplit( this.cascades, camera.near, far, 0.5, this.breaks );
+				break;
+
+			case 'custom':
+				if ( this.customSplitsCallback === undefined ) console.error( 'CSM: Custom split scheme callback not defined.' );
+				this.customSplitsCallback( this.cascades, camera.near, far, this.breaks );
+				break;
+
+		}
+
+		function uniformSplit( amount, near, far, target ) {
+
+			for ( let i = 1; i < amount; i ++ ) {
+
+				target.push( ( near + ( far - near ) * i / amount ) / far );
+
+			}
+
+			target.push( 1 );
+
+		}
+
+		function logarithmicSplit( amount, near, far, target ) {
+
+			for ( let i = 1; i < amount; i ++ ) {
+
+				target.push( ( near * ( far / near ) ** ( i / amount ) ) / far );
+
+			}
+
+			target.push( 1 );
+
+		}
+
+		function practicalSplit( amount, near, far, lambda, target ) {
+
+			_uniformArray.length = 0;
+			_logArray.length = 0;
+			logarithmicSplit( amount, near, far, _logArray );
+			uniformSplit( amount, near, far, _uniformArray );
+
+			for ( let i = 1; i < amount; i ++ ) {
+
+				target.push( MathUtils.lerp( _uniformArray[ i - 1 ], _logArray[ i - 1 ], lambda ) );
+
+			}
+
+			target.push( 1 );
+
+		}
+
+	}
+
+	setLightBreaks() {
+
+		for ( let i = 0, l = this.cascades; i < l; i ++ ) {
+
+			const amount = this.breaks[ i ];
+			const prev = this.breaks[ i - 1 ] || 0;
+
+			this._cascades[ i ].set( prev, amount );
+
+		}
+
+	}
+
+	updateShadowBounds() {
+
+		const frustums = this.frustums;
+
+		for ( let i = 0; i < frustums.length; i ++ ) {
+
+			const shadowCam = this.lights[ i ].shadow.camera;
+			const frustum = this.frustums[ i ];
+
+			// Get the two points that represent that furthest points on the frustum assuming
+			// that's either the diagonal across the far plane or the diagonal across the whole
+			// frustum itself.
+			const nearVerts = frustum.vertices.near;
+			const farVerts = frustum.vertices.far;
+			const point1 = farVerts[ 0 ];
+
+			let point2;
+
+			if ( point1.distanceTo( farVerts[ 2 ] ) > point1.distanceTo( nearVerts[ 2 ] ) ) {
+
+				point2 = farVerts[ 2 ];
+
+			} else {
+
+				point2 = nearVerts[ 2 ];
+
+			}
+
+			let squaredBBWidth = point1.distanceTo( point2 );
+
+			if ( this.fade ) {
+
+				// expand the shadow extents by the fade margin if fade is enabled.
+				const camera = this.camera;
+				const far = Math.max( camera.far, this.maxFar );
+				const linearDepth = frustum.vertices.far[ 0 ].z / ( far - camera.near );
+				const margin = 0.25 * Math.pow( linearDepth, 2.0 ) * ( far - camera.near );
+
+				squaredBBWidth += margin;
+
+			}
+
+			shadowCam.left = - squaredBBWidth / 2;
+			shadowCam.right = squaredBBWidth / 2;
+			shadowCam.top = squaredBBWidth / 2;
+			shadowCam.bottom = - squaredBBWidth / 2;
+			shadowCam.updateProjectionMatrix();
+
+		}
+
+	}
+
+	updateFrustums() {
+
+		this.getBreaks();
+		this.initCascades();
+		this.updateShadowBounds();
+		this.setLightBreaks();
+
+	}
+
+	setupFade() {
+
+		const cameraNear = reference( 'camera.near', 'float', this ).setGroup( renderGroup ).label( 'cameraNear' );
+		const cascades = reference( '_cascades', 'vec2', this ).setGroup( renderGroup ).label( 'cacades' );
+
+		const shadowFar = uniform( 'float' ).setGroup( renderGroup ).label( 'shadowFar' )
+			.onRenderUpdate( () => Math.min( this.maxFar, this.camera.far ) );
+
+		const linearDepth = viewZToOrthographicDepth( positionView.z, cameraNear, shadowFar ).toVar( 'linearDepth' );
+		const lastCascade = this.cascades - 1;
+
+		return Fn( () => {
+
+			const ret = vec4( 1, 1, 1, 1 ).toVar( 'shadowValue' );
+
+			const cascade = vec2().toVar( 'cascade' );
+			const cascadeCenter = float().toVar( 'cascadeCenter' );
+
+			const margin = float().toVar( 'margin' );
+
+			const csmX = float().toVar( 'csmX' );
+			const csmY = float().toVar( 'csmY' );
+
+			for ( let i = 0; i < this.cascades; i ++ ) {
+
+				const isLastCascade = i === lastCascade;
+
+				cascade.assign( cascades.element( i ) );
+
+				cascadeCenter.assign( cascade.x.add( cascade.y ).div( 2.0 ) );
+
+				const closestEdge = linearDepth.lessThan( cascadeCenter ).select( cascade.x, cascade.y );
+
+				margin.assign( float( 0.25 ).mul( closestEdge.pow( 2.0 ) ) );
+
+				csmX.assign( cascade.x.sub( margin.div( 2.0 ) ) );
+
+				if ( isLastCascade ) {
+
+					csmY.assign( cascade.y );
+
+				} else {
+
+					csmY.assign( cascade.y.add( margin.div( 2.0 ) ) );
+
+				}
+
+				const inRange = linearDepth.greaterThanEqual( csmX ).and( linearDepth.lessThanEqual( csmY ) );
+
+				If( inRange, () => {
+
+					const dist = min( linearDepth.sub( csmX ), csmY.sub( linearDepth ) ).toVar();
+
+					let ratio = dist.div( margin ).clamp( 0.0, 1.0 );
+
+					if ( i === 0 ) {
+
+						// dont fade at nearest edge
+						ratio = linearDepth.greaterThan( cascadeCenter ).select( ratio, 1 );
+
+					}
+
+					ret.subAssign( this._shadowNodes[ i ].oneMinus().mul( ratio ) );
+
+				} );
+
+			}
+
+			return ret;
+
+		} )();
+
+	}
+
+	setupStandard() {
+
+		const cameraNear = reference( 'camera.near', 'float', this ).setGroup( renderGroup ).label( 'cameraNear' );
+		const cascades = reference( '_cascades', 'vec2', this ).setGroup( renderGroup ).label( 'cacades' );
+
+		const shadowFar = uniform( 'float' ).setGroup( renderGroup ).label( 'shadowFar' )
+			.onRenderUpdate( () => Math.min( this.maxFar, this.camera.far ) );
+
+		const linearDepth = viewZToOrthographicDepth( positionView.z, cameraNear, shadowFar ).toVar( 'linearDepth' );
+
+		return Fn( () => {
+
+			const ret = vec4( 1, 1, 1, 1 ).toVar( 'shadowValue' );
+			const cascade = vec2().toVar( 'cascade' );
+
+			for ( let i = 0; i < this.cascades; i ++ ) {
+
+				cascade.assign( cascades.element( i ) );
+
+				If( linearDepth.greaterThanEqual( cascade.x ).and( linearDepth.lessThanEqual( cascade.y ) ), () => {
+
+					ret.assign( this._shadowNodes[ i ] );
+
+				} );
+
+			}
+
+			return ret;
+
+		} )();
+
+	}
+
+	setup( builder ) {
+
+		if ( this.camera === null ) this.init( builder );
+
+		return this.fade === true ? this.setupFade() : this.setupStandard();
+
+	}
+
+	updateBefore( /*builder*/ ) {
+
+		const light = this.light;
+		const camera = this.camera;
+		const frustums = this.frustums;
+
+		_lightDirection.subVectors( light.target.position, light.position ).normalize();
+
+		// for each frustum we need to find its min-max box aligned with the light orientation
+		// the position in _lightOrientationMatrix does not matter, as we transform there and back
+		_lightOrientationMatrix.lookAt( light.position, light.target.position, _up );
+		_lightOrientationMatrixInverse.copy( _lightOrientationMatrix ).invert();
+
+		for ( let i = 0; i < frustums.length; i ++ ) {
+
+			const lwLight = this.lights[ i ];
+			const shadow = lwLight.shadow;
+			const shadowCam = shadow.camera;
+			const texelWidth = ( shadowCam.right - shadowCam.left ) / shadow.mapSize.width;
+			const texelHeight = ( shadowCam.top - shadowCam.bottom ) / shadow.mapSize.height;
+
+			_cameraToLightMatrix.multiplyMatrices( _lightOrientationMatrixInverse, camera.matrixWorld );
+			frustums[ i ].toSpace( _cameraToLightMatrix, _lightSpaceFrustum );
+
+			const nearVerts = _lightSpaceFrustum.vertices.near;
+			const farVerts = _lightSpaceFrustum.vertices.far;
+
+			_bbox.makeEmpty();
+
+			for ( let j = 0; j < 4; j ++ ) {
+
+				_bbox.expandByPoint( nearVerts[ j ] );
+				_bbox.expandByPoint( farVerts[ j ] );
+
+			}
+
+			_bbox.getCenter( _center );
+			_center.z = _bbox.max.z + this.lightMargin;
+			_center.x = Math.floor( _center.x / texelWidth ) * texelWidth;
+			_center.y = Math.floor( _center.y / texelHeight ) * texelHeight;
+			_center.applyMatrix4( _lightOrientationMatrix );
+
+			lwLight.position.copy( _center );
+			lwLight.target.position.copy( _center );
+			lwLight.target.position.add( _lightDirection );
+
+		}
+
+	}
+
+	dispose() {
+
+		for ( let i = 0; i < this.lights.length; i ++ ) {
+
+			const light = this.lights[ i ];
+			const parent = light.parent;
+
+			parent.remove( light.target );
+			parent.remove( light );
+
+		}
+
+	}
+
+}
+
+export { CSMShadowNode };

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.

粤ICP备19079148号