super-three 0.163.0 → 0.165.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +1127 -452
  3. package/build/three.module.js +1127 -452
  4. package/build/three.module.min.js +2 -2
  5. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  6. package/examples/jsm/controls/TransformControls.js +1 -1
  7. package/examples/jsm/environments/RoomEnvironment.js +1 -5
  8. package/examples/jsm/exporters/GLTFExporter.js +45 -1
  9. package/examples/jsm/exporters/USDZExporter.js +13 -5
  10. package/examples/jsm/helpers/ViewHelper.js +32 -67
  11. package/examples/jsm/libs/draco/README.md +2 -2
  12. package/examples/jsm/libs/tween.module.js +75 -64
  13. package/examples/jsm/lines/LineMaterial.js +1 -15
  14. package/examples/jsm/lines/LineSegments2.js +15 -0
  15. package/examples/jsm/lines/Wireframe.js +16 -1
  16. package/examples/jsm/loaders/DRACOLoader.js +1 -1
  17. package/examples/jsm/loaders/EXRLoader.js +283 -99
  18. package/examples/jsm/loaders/FBXLoader.js +24 -13
  19. package/examples/jsm/loaders/GLTFLoader.js +55 -0
  20. package/examples/jsm/loaders/KTX2Loader.js +3 -6
  21. package/examples/jsm/loaders/LDrawLoader.js +3 -2
  22. package/examples/jsm/loaders/MMDLoader.js +31 -12
  23. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  24. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  25. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  26. package/examples/jsm/math/Octree.js +26 -20
  27. package/examples/jsm/modifiers/CurveModifier.js +11 -9
  28. package/examples/jsm/nodes/Nodes.js +15 -13
  29. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  30. package/examples/jsm/nodes/accessors/BitangentNode.js +7 -83
  31. package/examples/jsm/nodes/accessors/BufferNode.js +6 -0
  32. package/examples/jsm/nodes/accessors/CameraNode.js +12 -119
  33. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  34. package/examples/jsm/nodes/accessors/MaterialNode.js +109 -3
  35. package/examples/jsm/nodes/accessors/ModelNode.js +3 -0
  36. package/examples/jsm/nodes/accessors/NormalNode.js +9 -101
  37. package/examples/jsm/nodes/accessors/PositionNode.js +6 -100
  38. package/examples/jsm/nodes/accessors/ReferenceNode.js +6 -0
  39. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -31
  40. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  41. package/examples/jsm/nodes/accessors/{TextureStoreNode.js → StorageTextureNode.js} +19 -6
  42. package/examples/jsm/nodes/accessors/TangentNode.js +11 -97
  43. package/examples/jsm/nodes/accessors/Texture3DNode.js +100 -0
  44. package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
  45. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  46. package/examples/jsm/nodes/accessors/UVNode.js +2 -46
  47. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  48. package/examples/jsm/nodes/core/AttributeNode.js +15 -3
  49. package/examples/jsm/nodes/core/ContextNode.js +6 -0
  50. package/examples/jsm/nodes/core/Node.js +23 -2
  51. package/examples/jsm/nodes/core/NodeBuilder.js +25 -18
  52. package/examples/jsm/nodes/core/NodeKeywords.js +1 -1
  53. package/examples/jsm/nodes/core/OutputStructNode.js +3 -6
  54. package/examples/jsm/nodes/core/PropertyNode.js +11 -0
  55. package/examples/jsm/nodes/core/VaryingNode.js +40 -9
  56. package/examples/jsm/nodes/display/AfterImageNode.js +14 -2
  57. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  58. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  59. package/examples/jsm/nodes/display/PassNode.js +3 -1
  60. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  61. package/examples/jsm/nodes/display/ViewportNode.js +5 -3
  62. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  63. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  64. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  65. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  66. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  67. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  68. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +210 -12
  69. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  70. package/examples/jsm/nodes/functions/ToonLightingModel.js +49 -0
  71. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +20 -5
  72. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/EnvironmentNode.js +11 -2
  74. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  75. package/examples/jsm/nodes/lighting/LightsNode.js +28 -1
  76. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  77. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  78. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +11 -7
  79. package/examples/jsm/nodes/materials/Materials.js +4 -0
  80. package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +52 -0
  81. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  82. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  83. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +94 -6
  84. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  85. package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +34 -0
  86. package/examples/jsm/nodes/materials/NodeMaterial.js +43 -45
  87. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  88. package/examples/jsm/nodes/materials/VolumeNodeMaterial.js +106 -0
  89. package/examples/jsm/nodes/math/HashNode.js +2 -2
  90. package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
  91. package/examples/jsm/nodes/shadernode/ShaderNode.js +57 -41
  92. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  93. package/examples/jsm/nodes/utils/MatcapUVNode.js +1 -1
  94. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  95. package/examples/jsm/objects/Lensflare.js +2 -2
  96. package/examples/jsm/physics/JoltPhysics.js +281 -0
  97. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  98. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  99. package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
  100. package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
  101. package/examples/jsm/renderers/common/Attributes.js +2 -0
  102. package/examples/jsm/renderers/common/Background.js +3 -3
  103. package/examples/jsm/renderers/common/Bindings.js +17 -0
  104. package/examples/jsm/renderers/common/ChainMap.js +18 -48
  105. package/examples/jsm/renderers/common/ClippingContext.js +5 -5
  106. package/examples/jsm/renderers/common/Pipelines.js +2 -2
  107. package/examples/jsm/renderers/common/RenderBundle.js +18 -0
  108. package/examples/jsm/renderers/common/RenderBundles.js +38 -0
  109. package/examples/jsm/renderers/common/RenderList.js +10 -1
  110. package/examples/jsm/renderers/common/RenderObject.js +49 -1
  111. package/examples/jsm/renderers/common/Renderer.js +268 -25
  112. package/examples/jsm/renderers/common/Textures.js +1 -1
  113. package/examples/jsm/renderers/common/Uniform.js +1 -1
  114. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
  115. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +18 -4
  116. package/examples/jsm/renderers/common/nodes/NodeSampler.js +6 -0
  117. package/examples/jsm/renderers/common/nodes/Nodes.js +31 -47
  118. package/examples/jsm/renderers/webgl/WebGLBackend.js +7 -21
  119. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +5 -1
  120. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +23 -5
  121. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +114 -13
  122. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
  123. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +80 -46
  124. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +85 -12
  125. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +10 -1
  127. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +6 -0
  128. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +62 -19
  129. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -3
  130. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  131. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  132. package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
  133. package/examples/jsm/utils/GPUStatsPanel.js +2 -0
  134. package/examples/jsm/utils/SceneUtils.js +60 -1
  135. package/examples/jsm/utils/SortUtils.js +8 -5
  136. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  137. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  138. package/package.json +3 -2
  139. package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
  140. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
  141. package/src/animation/tracks/StringKeyframeTrack.js +10 -1
  142. package/src/constants.js +1 -1
  143. package/src/core/Object3D.js +2 -0
  144. package/src/core/Raycaster.js +6 -2
  145. package/src/core/RenderTarget.js +8 -0
  146. package/src/extras/PMREMGenerator.js +12 -11
  147. package/src/loaders/FileLoader.js +5 -1
  148. package/src/loaders/LoaderUtils.js +3 -1
  149. package/src/loaders/MaterialLoader.js +1 -0
  150. package/src/loaders/ObjectLoader.js +1 -0
  151. package/src/materials/Material.js +2 -0
  152. package/src/materials/MeshPhysicalMaterial.js +20 -0
  153. package/src/objects/BatchedMesh.js +114 -1
  154. package/src/objects/Line.js +66 -43
  155. package/src/renderers/WebGLRenderer.js +371 -109
  156. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +15 -0
  157. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
  158. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
  159. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
  160. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  161. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  162. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
  163. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
  164. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
  165. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
  166. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
  167. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  168. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  169. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  170. package/src/renderers/shaders/ShaderChunk.js +0 -2
  171. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  172. package/src/renderers/shaders/ShaderLib.js +1 -0
  173. package/src/renderers/webgl/WebGLBackground.js +24 -3
  174. package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
  175. package/src/renderers/webgl/WebGLCapabilities.js +33 -1
  176. package/src/renderers/webgl/WebGLExtensions.js +3 -1
  177. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
  178. package/src/renderers/webgl/WebGLLights.js +9 -12
  179. package/src/renderers/webgl/WebGLMaterials.js +7 -5
  180. package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
  181. package/src/renderers/webgl/WebGLProgram.js +5 -36
  182. package/src/renderers/webgl/WebGLPrograms.js +19 -14
  183. package/src/renderers/webgl/WebGLRenderStates.js +8 -4
  184. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  185. package/src/renderers/webgl/WebGLTextures.js +206 -129
  186. package/src/renderers/webgl/WebGLUtils.js +3 -21
  187. package/src/renderers/webxr/WebXRDepthSensing.js +3 -3
  188. package/src/renderers/webxr/WebXRManager.js +8 -6
  189. package/src/textures/CompressedArrayTexture.js +14 -0
  190. package/src/textures/DataArrayTexture.js +14 -0
  191. package/src/textures/DepthTexture.js +1 -3
  192. package/src/utils.js +30 -1
  193. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -318
  194. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  195. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -792
  196. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  197. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -16,4 +16,19 @@ export default /* glsl */`
16
16
 
17
17
  }
18
18
  #endif
19
+
20
+ #ifdef USE_BATCHING_COLOR
21
+
22
+ uniform sampler2D batchingColorTexture;
23
+ vec3 getBatchingColor( const in float i ) {
24
+
25
+ int size = textureSize( batchingColorTexture, 0 ).x;
26
+ int j = int( i );
27
+ int x = j % size;
28
+ int y = j / size;
29
+ return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;
30
+
31
+ }
32
+
33
+ #endif
19
34
  `;
@@ -3,7 +3,7 @@ export default /* glsl */`
3
3
 
4
4
  varying vec4 vColor;
5
5
 
6
- #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )
6
+ #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )
7
7
 
8
8
  varying vec3 vColor;
9
9
 
@@ -3,7 +3,7 @@ export default /* glsl */`
3
3
 
4
4
  vColor = vec4( 1.0 );
5
5
 
6
- #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )
6
+ #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )
7
7
 
8
8
  vColor = vec3( 1.0 );
9
9
 
@@ -19,5 +19,13 @@ export default /* glsl */`
19
19
 
20
20
  vColor.xyz *= instanceColor.xyz;
21
21
 
22
+ #endif
23
+
24
+ #ifdef USE_BATCHING_COLOR
25
+
26
+ vec3 batchingColor = getBatchingColor( batchId );
27
+
28
+ vColor.xyz *= batchingColor.xyz;
29
+
22
30
  #endif
23
31
  `;
@@ -55,32 +55,18 @@ vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {
55
55
 
56
56
  float getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {
57
57
 
58
- #if defined ( LEGACY_LIGHTS )
58
+ // based upon Frostbite 3 Moving to Physically-based Rendering
59
+ // page 32, equation 26: E[window1]
60
+ // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
61
+ float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );
59
62
 
60
- if ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {
63
+ if ( cutoffDistance > 0.0 ) {
61
64
 
62
- return pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );
65
+ distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );
63
66
 
64
- }
65
-
66
- return 1.0;
67
-
68
- #else
69
-
70
- // based upon Frostbite 3 Moving to Physically-based Rendering
71
- // page 32, equation 26: E[window1]
72
- // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
73
- float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );
74
-
75
- if ( cutoffDistance > 0.0 ) {
76
-
77
- distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );
78
-
79
- }
80
-
81
- return distanceFalloff;
67
+ }
82
68
 
83
- #endif
69
+ return distanceFalloff;
84
70
 
85
71
  }
86
72
 
@@ -75,6 +75,12 @@ material.roughness = min( material.roughness, 1.0 );
75
75
 
76
76
  #endif
77
77
 
78
+ #ifdef USE_DISPERSION
79
+
80
+ material.dispersion = dispersion;
81
+
82
+ #endif
83
+
78
84
  #ifdef USE_IRIDESCENCE
79
85
 
80
86
  material.iridescence = iridescence;
@@ -6,6 +6,7 @@ struct PhysicalMaterial {
6
6
  float roughness;
7
7
  vec3 specularColor;
8
8
  float specularF90;
9
+ float dispersion;
9
10
 
10
11
  #ifdef USE_CLEARCOAT
11
12
  float clearcoat;
@@ -1,5 +1,5 @@
1
1
  export default /* glsl */`
2
- #if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )
2
+ #if defined( USE_MORPHCOLORS )
3
3
 
4
4
  // morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:
5
5
  // When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in normal = sum((target - base) * influence)
@@ -1,7 +1,7 @@
1
1
  export default /* glsl */`
2
2
  #ifdef USE_INSTANCING_MORPH
3
3
 
4
- float morphTargetInfluences[MORPHTARGETS_COUNT];
4
+ float morphTargetInfluences[ MORPHTARGETS_COUNT ];
5
5
 
6
6
  float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;
7
7
 
@@ -6,22 +6,11 @@ export default /* glsl */`
6
6
  // When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting
7
7
  objectNormal *= morphTargetBaseInfluence;
8
8
 
9
- #ifdef MORPHTARGETS_TEXTURE
9
+ for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
10
10
 
11
- for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
11
+ if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];
12
12
 
13
- if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];
14
-
15
- }
16
-
17
- #else
18
-
19
- objectNormal += morphNormal0 * morphTargetInfluences[ 0 ];
20
- objectNormal += morphNormal1 * morphTargetInfluences[ 1 ];
21
- objectNormal += morphNormal2 * morphTargetInfluences[ 2 ];
22
- objectNormal += morphNormal3 * morphTargetInfluences[ 3 ];
23
-
24
- #endif
13
+ }
25
14
 
26
15
  #endif
27
16
  `;
@@ -4,44 +4,23 @@ export default /* glsl */`
4
4
  #ifndef USE_INSTANCING_MORPH
5
5
 
6
6
  uniform float morphTargetBaseInfluence;
7
+ uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];
7
8
 
8
9
  #endif
9
10
 
10
- #ifdef MORPHTARGETS_TEXTURE
11
+ uniform sampler2DArray morphTargetsTexture;
12
+ uniform ivec2 morphTargetsTextureSize;
11
13
 
12
- #ifndef USE_INSTANCING_MORPH
14
+ vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {
13
15
 
14
- uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];
16
+ int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;
17
+ int y = texelIndex / morphTargetsTextureSize.x;
18
+ int x = texelIndex - y * morphTargetsTextureSize.x;
15
19
 
16
- #endif
20
+ ivec3 morphUV = ivec3( x, y, morphTargetIndex );
21
+ return texelFetch( morphTargetsTexture, morphUV, 0 );
17
22
 
18
- uniform sampler2DArray morphTargetsTexture;
19
- uniform ivec2 morphTargetsTextureSize;
20
-
21
- vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {
22
-
23
- int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;
24
- int y = texelIndex / morphTargetsTextureSize.x;
25
- int x = texelIndex - y * morphTargetsTextureSize.x;
26
-
27
- ivec3 morphUV = ivec3( x, y, morphTargetIndex );
28
- return texelFetch( morphTargetsTexture, morphUV, 0 );
29
-
30
- }
31
-
32
- #else
33
-
34
- #ifndef USE_MORPHNORMALS
35
-
36
- uniform float morphTargetInfluences[ 8 ];
37
-
38
- #else
39
-
40
- uniform float morphTargetInfluences[ 4 ];
41
-
42
- #endif
43
-
44
- #endif
23
+ }
45
24
 
46
25
  #endif
47
26
  `;
@@ -6,31 +6,11 @@ export default /* glsl */`
6
6
  // When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting
7
7
  transformed *= morphTargetBaseInfluence;
8
8
 
9
- #ifdef MORPHTARGETS_TEXTURE
9
+ for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
10
10
 
11
- for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
11
+ if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];
12
12
 
13
- if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];
14
-
15
- }
16
-
17
- #else
18
-
19
- transformed += morphTarget0 * morphTargetInfluences[ 0 ];
20
- transformed += morphTarget1 * morphTargetInfluences[ 1 ];
21
- transformed += morphTarget2 * morphTargetInfluences[ 2 ];
22
- transformed += morphTarget3 * morphTargetInfluences[ 3 ];
23
-
24
- #ifndef USE_MORPHNORMALS
25
-
26
- transformed += morphTarget4 * morphTargetInfluences[ 4 ];
27
- transformed += morphTarget5 * morphTargetInfluences[ 5 ];
28
- transformed += morphTarget6 * morphTargetInfluences[ 6 ];
29
- transformed += morphTarget7 * morphTargetInfluences[ 7 ];
30
-
31
- #endif
32
-
33
- #endif
13
+ }
34
14
 
35
15
  #endif
36
16
  `;
@@ -168,24 +168,32 @@ vec3 AgXToneMapping( vec3 color ) {
168
168
  // https://modelviewer.dev/examples/tone-mapping
169
169
 
170
170
  vec3 NeutralToneMapping( vec3 color ) {
171
- float startCompression = 0.8 - 0.04;
172
- float desaturation = 0.15;
171
+
172
+ const float StartCompression = 0.8 - 0.04;
173
+ const float Desaturation = 0.15;
173
174
 
174
175
  color *= toneMappingExposure;
175
176
 
176
- float x = min(color.r, min(color.g, color.b));
177
+ float x = min( color.r, min( color.g, color.b ) );
178
+
177
179
  float offset = x < 0.08 ? x - 6.25 * x * x : 0.04;
180
+
178
181
  color -= offset;
179
182
 
180
- float peak = max(color.r, max(color.g, color.b));
181
- if (peak < startCompression) return color;
183
+ float peak = max( color.r, max( color.g, color.b ) );
184
+
185
+ if ( peak < StartCompression ) return color;
186
+
187
+ float d = 1. - StartCompression;
188
+
189
+ float newPeak = 1. - d * d / ( peak + d - StartCompression );
182
190
 
183
- float d = 1. - startCompression;
184
- float newPeak = 1. - d * d / (peak + d - startCompression);
185
191
  color *= newPeak / peak;
186
192
 
187
- float g = 1. - 1. / (desaturation * (peak - newPeak) + 1.);
188
- return mix(color, newPeak * vec3(1, 1, 1), g);
193
+ float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );
194
+
195
+ return mix( color, vec3( newPeak ), g );
196
+
189
197
  }
190
198
 
191
199
  vec3 CustomToneMapping( vec3 color ) { return color; }
@@ -25,7 +25,7 @@ export default /* glsl */`
25
25
 
26
26
  vec4 transmitted = getIBLVolumeRefraction(
27
27
  n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
28
- pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,
28
+ pos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,
29
29
  material.attenuationColor, material.attenuationDistance );
30
30
 
31
31
  material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );
@@ -169,22 +169,56 @@ export default /* glsl */`
169
169
 
170
170
  vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,
171
171
  const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,
172
- const in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,
172
+ const in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,
173
173
  const in vec3 attenuationColor, const in float attenuationDistance ) {
174
174
 
175
- vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );
176
- vec3 refractedRayExit = position + transmissionRay;
175
+ vec4 transmittedLight;
176
+ vec3 transmittance;
177
+
178
+ #ifdef USE_DISPERSION
179
+
180
+ float halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;
181
+ vec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );
182
+
183
+ for ( int i = 0; i < 3; i ++ ) {
184
+
185
+ vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );
186
+ vec3 refractedRayExit = position + transmissionRay;
187
+
188
+ // Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
189
+ vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
190
+ vec2 refractionCoords = ndcPos.xy / ndcPos.w;
191
+ refractionCoords += 1.0;
192
+ refractionCoords /= 2.0;
193
+
194
+ // Sample framebuffer to get pixel the refracted ray hits.
195
+ vec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );
196
+ transmittedLight[ i ] = transmissionSample[ i ];
197
+ transmittedLight.a += transmissionSample.a;
198
+
199
+ transmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];
200
+
201
+ }
202
+
203
+ transmittedLight.a /= 3.0;
204
+
205
+ #else
206
+
207
+ vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );
208
+ vec3 refractedRayExit = position + transmissionRay;
209
+
210
+ // Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
211
+ vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
212
+ vec2 refractionCoords = ndcPos.xy / ndcPos.w;
213
+ refractionCoords += 1.0;
214
+ refractionCoords /= 2.0;
215
+
216
+ // Sample framebuffer to get pixel the refracted ray hits.
217
+ transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );
218
+ transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );
219
+
220
+ #endif
177
221
 
178
- // Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
179
- vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
180
- vec2 refractionCoords = ndcPos.xy / ndcPos.w;
181
- refractionCoords += 1.0;
182
- refractionCoords /= 2.0;
183
-
184
- // Sample framebuffer to get pixel the refracted ray hits.
185
- vec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );
186
-
187
- vec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );
188
222
  vec3 attenuatedColor = transmittance * transmittedLight.rgb;
189
223
 
190
224
  // Get the specular component.
@@ -40,7 +40,6 @@ import fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl.js';
40
40
  import fog_fragment from './ShaderChunk/fog_fragment.glsl.js';
41
41
  import fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl.js';
42
42
  import gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl.js';
43
- import lightmap_fragment from './ShaderChunk/lightmap_fragment.glsl.js';
44
43
  import lightmap_pars_fragment from './ShaderChunk/lightmap_pars_fragment.glsl.js';
45
44
  import lights_lambert_fragment from './ShaderChunk/lights_lambert_fragment.glsl.js';
46
45
  import lights_lambert_pars_fragment from './ShaderChunk/lights_lambert_pars_fragment.glsl.js';
@@ -169,7 +168,6 @@ export const ShaderChunk = {
169
168
  fog_fragment: fog_fragment,
170
169
  fog_pars_fragment: fog_pars_fragment,
171
170
  gradientmap_pars_fragment: gradientmap_pars_fragment,
172
- lightmap_fragment: lightmap_fragment,
173
171
  lightmap_pars_fragment: lightmap_pars_fragment,
174
172
  lights_lambert_fragment: lights_lambert_fragment,
175
173
  lights_lambert_pars_fragment: lights_lambert_pars_fragment,
@@ -95,6 +95,10 @@ uniform float opacity;
95
95
  uniform float clearcoatRoughness;
96
96
  #endif
97
97
 
98
+ #ifdef USE_DISPERSION
99
+ uniform float dispersion;
100
+ #endif
101
+
98
102
  #ifdef USE_IRIDESCENCE
99
103
  uniform float iridescence;
100
104
  uniform float iridescenceIOR;
@@ -314,6 +314,7 @@ ShaderLib.physical = {
314
314
  clearcoatRoughness: { value: 0 },
315
315
  clearcoatRoughnessMap: { value: null },
316
316
  clearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },
317
+ dispersion: { value: 0 },
317
318
  iridescence: { value: 0 },
318
319
  iridescenceMap: { value: null },
319
320
  iridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },
@@ -26,9 +26,8 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
26
26
  let currentBackgroundVersion = 0;
27
27
  let currentTonemapping = null;
28
28
 
29
- function render( renderList, scene ) {
29
+ function getBackground( scene ) {
30
30
 
31
- let forceClear = false;
32
31
  let background = scene.isScene === true ? scene.background : null;
33
32
 
34
33
  if ( background && background.isTexture ) {
@@ -38,6 +37,15 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
38
37
 
39
38
  }
40
39
 
40
+ return background;
41
+
42
+ }
43
+
44
+ function render( scene ) {
45
+
46
+ let forceClear = false;
47
+ const background = getBackground( scene );
48
+
41
49
  if ( background === null ) {
42
50
 
43
51
  setClear( clearColor, clearAlpha );
@@ -63,10 +71,22 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
63
71
 
64
72
  if ( renderer.autoClear || forceClear ) {
65
73
 
74
+ // buffers might not be writable which is required to ensure a correct clear
75
+
76
+ state.buffers.depth.setTest( true );
77
+ state.buffers.depth.setMask( true );
78
+ state.buffers.color.setMask( true );
79
+
66
80
  renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
67
81
 
68
82
  }
69
83
 
84
+ }
85
+
86
+ function addToRenderList( renderList, scene ) {
87
+
88
+ const background = getBackground( scene );
89
+
70
90
  if ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {
71
91
 
72
92
  if ( boxMesh === undefined ) {
@@ -247,7 +267,8 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
247
267
  setClear( clearColor, clearAlpha );
248
268
 
249
269
  },
250
- render: render
270
+ render: render,
271
+ addToRenderList: addToRenderList
251
272
 
252
273
  };
253
274
 
@@ -57,12 +57,48 @@ function WebGLBufferRenderer( gl, extensions, info ) {
57
57
 
58
58
  }
59
59
 
60
+ function renderMultiDrawInstances( starts, counts, drawCount, primcount ) {
61
+
62
+ if ( drawCount === 0 ) return;
63
+
64
+ const extension = extensions.get( 'WEBGL_multi_draw' );
65
+
66
+ if ( extension === null ) {
67
+
68
+ for ( let i = 0; i < starts.length; i ++ ) {
69
+
70
+ renderInstances( starts[ i ], counts[ i ], primcount[ i ] );
71
+
72
+ }
73
+
74
+ } else {
75
+
76
+ extension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );
77
+
78
+ let elementCount = 0;
79
+ for ( let i = 0; i < drawCount; i ++ ) {
80
+
81
+ elementCount += counts[ i ];
82
+
83
+ }
84
+
85
+ for ( let i = 0; i < primcount.length; i ++ ) {
86
+
87
+ info.update( elementCount, mode, primcount[ i ] );
88
+
89
+ }
90
+
91
+ }
92
+
93
+ }
94
+
60
95
  //
61
96
 
62
97
  this.setMode = setMode;
63
98
  this.render = render;
64
99
  this.renderInstances = renderInstances;
65
100
  this.renderMultiDraw = renderMultiDraw;
101
+ this.renderMultiDrawInstances = renderMultiDrawInstances;
66
102
 
67
103
  }
68
104
 
@@ -1,4 +1,6 @@
1
- function WebGLCapabilities( gl, extensions, parameters ) {
1
+ import { FloatType, HalfFloatType, RGBAFormat, UnsignedByteType } from '../../constants.js';
2
+
3
+ function WebGLCapabilities( gl, extensions, parameters, utils ) {
2
4
 
3
5
  let maxAnisotropy;
4
6
 
@@ -22,6 +24,33 @@ function WebGLCapabilities( gl, extensions, parameters ) {
22
24
 
23
25
  }
24
26
 
27
+ function textureFormatReadable( textureFormat ) {
28
+
29
+ if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
30
+
31
+ return false;
32
+
33
+ }
34
+
35
+ return true;
36
+
37
+ }
38
+
39
+ function textureTypeReadable( textureType ) {
40
+
41
+ const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );
42
+
43
+ if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)
44
+ textureType !== FloatType && ! halfFloatSupportedByExt ) {
45
+
46
+ return false;
47
+
48
+ }
49
+
50
+ return true;
51
+
52
+ }
53
+
25
54
  function getMaxPrecision( precision ) {
26
55
 
27
56
  if ( precision === 'highp' ) {
@@ -85,6 +114,9 @@ function WebGLCapabilities( gl, extensions, parameters ) {
85
114
  getMaxAnisotropy: getMaxAnisotropy,
86
115
  getMaxPrecision: getMaxPrecision,
87
116
 
117
+ textureFormatReadable: textureFormatReadable,
118
+ textureTypeReadable: textureTypeReadable,
119
+
88
120
  precision: precision,
89
121
  logarithmicDepthBuffer: logarithmicDepthBuffer,
90
122
 
@@ -1,3 +1,5 @@
1
+ import { warnOnce } from '../../utils.js';
2
+
1
3
  function WebGLExtensions( gl ) {
2
4
 
3
5
  const extensions = {};
@@ -66,7 +68,7 @@ function WebGLExtensions( gl ) {
66
68
 
67
69
  if ( extension === null ) {
68
70
 
69
- console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );
71
+ warnOnce( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );
70
72
 
71
73
  }
72
74
 
@@ -66,6 +66,41 @@ function WebGLIndexedBufferRenderer( gl, extensions, info ) {
66
66
 
67
67
  }
68
68
 
69
+ function renderMultiDrawInstances( starts, counts, drawCount, primcount ) {
70
+
71
+ if ( drawCount === 0 ) return;
72
+
73
+ const extension = extensions.get( 'WEBGL_multi_draw' );
74
+
75
+ if ( extension === null ) {
76
+
77
+ for ( let i = 0; i < starts.length; i ++ ) {
78
+
79
+ renderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );
80
+
81
+ }
82
+
83
+ } else {
84
+
85
+ extension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );
86
+
87
+ let elementCount = 0;
88
+ for ( let i = 0; i < drawCount; i ++ ) {
89
+
90
+ elementCount += counts[ i ];
91
+
92
+ }
93
+
94
+ for ( let i = 0; i < primcount.length; i ++ ) {
95
+
96
+ info.update( elementCount, mode, primcount[ i ] );
97
+
98
+ }
99
+
100
+ }
101
+
102
+ }
103
+
69
104
  //
70
105
 
71
106
  this.setMode = setMode;
@@ -73,6 +108,7 @@ function WebGLIndexedBufferRenderer( gl, extensions, info ) {
73
108
  this.render = render;
74
109
  this.renderInstances = renderInstances;
75
110
  this.renderMultiDraw = renderMultiDraw;
111
+ this.renderMultiDrawInstances = renderMultiDrawInstances;
76
112
 
77
113
  }
78
114