super-three 0.162.0 → 0.164.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 (187) hide show
  1. package/build/three.cjs +847 -1226
  2. package/build/three.module.js +846 -1225
  3. package/build/three.module.min.js +2 -2
  4. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  5. package/examples/jsm/controls/TransformControls.js +3 -3
  6. package/examples/jsm/exporters/GLTFExporter.js +66 -5
  7. package/examples/jsm/exporters/USDZExporter.js +22 -1
  8. package/examples/jsm/geometries/TextGeometry.js +10 -2
  9. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  10. package/examples/jsm/libs/draco/README.md +2 -2
  11. package/examples/jsm/libs/fflate.module.js +694 -496
  12. package/examples/jsm/lines/LineMaterial.js +0 -2
  13. package/examples/jsm/loaders/3MFLoader.js +2 -0
  14. package/examples/jsm/loaders/EXRLoader.js +351 -97
  15. package/examples/jsm/loaders/FBXLoader.js +1 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +59 -0
  17. package/examples/jsm/loaders/KTX2Loader.js +3 -10
  18. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  19. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  20. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  21. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  22. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  23. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  24. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  25. package/examples/jsm/math/Octree.js +26 -20
  26. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  27. package/examples/jsm/nodes/Nodes.js +10 -4
  28. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  29. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  30. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  31. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  32. package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
  33. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
  35. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  36. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  38. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +51 -10
  40. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  41. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  42. package/examples/jsm/nodes/core/Node.js +63 -4
  43. package/examples/jsm/nodes/core/NodeBuilder.js +26 -25
  44. package/examples/jsm/nodes/core/NodeFrame.js +10 -10
  45. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  46. package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
  47. package/examples/jsm/nodes/core/PropertyNode.js +10 -0
  48. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  49. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  50. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  51. package/examples/jsm/nodes/display/PassNode.js +17 -1
  52. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  53. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  54. package/examples/jsm/nodes/display/ViewportNode.js +4 -2
  55. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  56. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  57. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  58. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  59. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  60. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  61. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  62. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  63. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  64. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  65. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +164 -10
  66. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  67. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  68. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  69. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -70
  70. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  71. package/examples/jsm/nodes/lighting/LightsNode.js +11 -1
  72. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +10 -6
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  77. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  78. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +76 -5
  79. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  80. package/examples/jsm/nodes/materials/NodeMaterial.js +55 -43
  81. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  82. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  83. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +3 -9
  85. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  86. package/examples/jsm/objects/QuadMesh.js +7 -23
  87. package/examples/jsm/physics/JoltPhysics.js +281 -0
  88. package/examples/jsm/physics/RapierPhysics.js +4 -4
  89. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  90. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  91. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  92. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  93. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  94. package/examples/jsm/renderers/common/Animation.js +3 -0
  95. package/examples/jsm/renderers/common/Background.js +8 -8
  96. package/examples/jsm/renderers/common/ClippingContext.js +1 -1
  97. package/examples/jsm/renderers/common/Info.js +11 -19
  98. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  99. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  100. package/examples/jsm/renderers/common/RenderList.js +1 -1
  101. package/examples/jsm/renderers/common/RenderObject.js +47 -5
  102. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  103. package/examples/jsm/renderers/common/Renderer.js +153 -21
  104. package/examples/jsm/renderers/common/Textures.js +1 -1
  105. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +773 -0
  106. package/examples/jsm/renderers/common/nodes/Nodes.js +34 -63
  107. package/examples/jsm/renderers/webgl/WebGLBackend.js +146 -36
  108. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +145 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +9 -3
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
  111. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +64 -7
  113. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +6 -23
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +77 -60
  115. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -4
  116. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +29 -1
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
  119. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  120. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  121. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  122. package/examples/jsm/utils/SceneUtils.js +60 -1
  123. package/examples/jsm/utils/TextureUtils.js +1 -1
  124. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  125. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  126. package/package.json +1 -1
  127. package/src/Three.js +0 -1
  128. package/src/animation/AnimationClip.js +1 -1
  129. package/src/constants.js +3 -3
  130. package/src/core/Object3D.js +10 -7
  131. package/src/core/RenderTarget.js +8 -0
  132. package/src/extras/PMREMGenerator.js +21 -11
  133. package/src/loaders/FileLoader.js +1 -1
  134. package/src/loaders/MaterialLoader.js +1 -0
  135. package/src/loaders/ObjectLoader.js +2 -0
  136. package/src/materials/Material.js +2 -0
  137. package/src/materials/MeshPhysicalMaterial.js +20 -0
  138. package/src/materials/ShaderMaterial.js +0 -4
  139. package/src/math/Spherical.js +4 -5
  140. package/src/objects/BatchedMesh.js +27 -3
  141. package/src/objects/InstancedMesh.js +10 -0
  142. package/src/objects/Line.js +66 -43
  143. package/src/renderers/WebGLRenderer.js +130 -158
  144. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  145. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  146. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  147. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  148. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  149. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  150. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  151. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  152. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  153. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  154. package/src/renderers/shaders/ShaderChunk.js +0 -2
  155. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  156. package/src/renderers/shaders/ShaderLib.js +2 -1
  157. package/src/renderers/shaders/UniformsUtils.js +10 -1
  158. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  159. package/src/renderers/webgl/WebGLBackground.js +18 -3
  160. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  161. package/src/renderers/webgl/WebGLBufferRenderer.js +35 -21
  162. package/src/renderers/webgl/WebGLCapabilities.js +35 -13
  163. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  164. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  165. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +35 -21
  166. package/src/renderers/webgl/WebGLLights.js +6 -32
  167. package/src/renderers/webgl/WebGLMaterials.js +8 -3
  168. package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
  169. package/src/renderers/webgl/WebGLProgram.js +21 -52
  170. package/src/renderers/webgl/WebGLPrograms.js +24 -31
  171. package/src/renderers/webgl/WebGLRenderStates.js +13 -7
  172. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  173. package/src/renderers/webgl/WebGLState.js +15 -59
  174. package/src/renderers/webgl/WebGLTextures.js +138 -292
  175. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  176. package/src/renderers/webgl/WebGLUtils.js +9 -78
  177. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  178. package/src/renderers/webxr/WebXRManager.js +4 -6
  179. package/src/scenes/Scene.js +7 -1
  180. package/src/textures/Texture.js +11 -1
  181. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  182. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -320
  183. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  184. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -794
  185. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  186. package/src/renderers/WebGL1Renderer.js +0 -7
  187. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -3,296 +3,158 @@ import { DataArrayTexture } from '../../textures/DataArrayTexture.js';
3
3
  import { Vector4 } from '../../math/Vector4.js';
4
4
  import { Vector2 } from '../../math/Vector2.js';
5
5
 
6
- function numericalSort( a, b ) {
7
-
8
- return a[ 0 ] - b[ 0 ];
9
-
10
- }
11
-
12
- function absNumericalSort( a, b ) {
13
-
14
- return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
15
-
16
- }
17
-
18
6
  function WebGLMorphtargets( gl, capabilities, textures ) {
19
7
 
20
- const influencesList = {};
21
- const morphInfluences = new Float32Array( 8 );
22
8
  const morphTextures = new WeakMap();
23
9
  const morph = new Vector4();
24
10
 
25
- const workInfluences = [];
26
-
27
- for ( let i = 0; i < 8; i ++ ) {
28
-
29
- workInfluences[ i ] = [ i, 0 ];
30
-
31
- }
32
-
33
11
  function update( object, geometry, program ) {
34
12
 
35
13
  const objectInfluences = object.morphTargetInfluences;
36
14
 
37
- if ( capabilities.isWebGL2 === true ) {
38
-
39
- // instead of using attributes, the WebGL 2 code path encodes morph targets
40
- // into an array of data textures. Each layer represents a single morph target.
41
-
42
- const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
43
- const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
44
-
45
- let entry = morphTextures.get( geometry );
46
-
47
- if ( entry === undefined || entry.count !== morphTargetsCount ) {
48
-
49
- if ( entry !== undefined ) entry.texture.dispose();
50
-
51
- const hasMorphPosition = geometry.morphAttributes.position !== undefined;
52
- const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
53
- const hasMorphColors = geometry.morphAttributes.color !== undefined;
54
-
55
- const morphTargets = geometry.morphAttributes.position || [];
56
- const morphNormals = geometry.morphAttributes.normal || [];
57
- const morphColors = geometry.morphAttributes.color || [];
58
-
59
- let vertexDataCount = 0;
60
-
61
- if ( hasMorphPosition === true ) vertexDataCount = 1;
62
- if ( hasMorphNormals === true ) vertexDataCount = 2;
63
- if ( hasMorphColors === true ) vertexDataCount = 3;
15
+ // instead of using attributes, the WebGL 2 code path encodes morph targets
16
+ // into an array of data textures. Each layer represents a single morph target.
64
17
 
65
- let width = geometry.attributes.position.count * vertexDataCount;
66
- let height = 1;
18
+ const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
19
+ const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
67
20
 
68
- if ( width > capabilities.maxTextureSize ) {
21
+ let entry = morphTextures.get( geometry );
69
22
 
70
- height = Math.ceil( width / capabilities.maxTextureSize );
71
- width = capabilities.maxTextureSize;
23
+ if ( entry === undefined || entry.count !== morphTargetsCount ) {
72
24
 
73
- }
74
-
75
- const buffer = new Float32Array( width * height * 4 * morphTargetsCount );
25
+ if ( entry !== undefined ) entry.texture.dispose();
76
26
 
77
- const texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );
78
- texture.type = FloatType;
79
- texture.needsUpdate = true;
27
+ const hasMorphPosition = geometry.morphAttributes.position !== undefined;
28
+ const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
29
+ const hasMorphColors = geometry.morphAttributes.color !== undefined;
80
30
 
81
- // fill buffer
31
+ const morphTargets = geometry.morphAttributes.position || [];
32
+ const morphNormals = geometry.morphAttributes.normal || [];
33
+ const morphColors = geometry.morphAttributes.color || [];
82
34
 
83
- const vertexDataStride = vertexDataCount * 4;
35
+ let vertexDataCount = 0;
84
36
 
85
- for ( let i = 0; i < morphTargetsCount; i ++ ) {
37
+ if ( hasMorphPosition === true ) vertexDataCount = 1;
38
+ if ( hasMorphNormals === true ) vertexDataCount = 2;
39
+ if ( hasMorphColors === true ) vertexDataCount = 3;
86
40
 
87
- const morphTarget = morphTargets[ i ];
88
- const morphNormal = morphNormals[ i ];
89
- const morphColor = morphColors[ i ];
41
+ let width = geometry.attributes.position.count * vertexDataCount;
42
+ let height = 1;
90
43
 
91
- const offset = width * height * 4 * i;
44
+ if ( width > capabilities.maxTextureSize ) {
92
45
 
93
- for ( let j = 0; j < morphTarget.count; j ++ ) {
46
+ height = Math.ceil( width / capabilities.maxTextureSize );
47
+ width = capabilities.maxTextureSize;
94
48
 
95
- const stride = j * vertexDataStride;
49
+ }
96
50
 
97
- if ( hasMorphPosition === true ) {
51
+ const buffer = new Float32Array( width * height * 4 * morphTargetsCount );
98
52
 
99
- morph.fromBufferAttribute( morphTarget, j );
53
+ const texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );
54
+ texture.type = FloatType;
55
+ texture.needsUpdate = true;
100
56
 
101
- buffer[ offset + stride + 0 ] = morph.x;
102
- buffer[ offset + stride + 1 ] = morph.y;
103
- buffer[ offset + stride + 2 ] = morph.z;
104
- buffer[ offset + stride + 3 ] = 0;
57
+ // fill buffer
105
58
 
106
- }
59
+ const vertexDataStride = vertexDataCount * 4;
107
60
 
108
- if ( hasMorphNormals === true ) {
61
+ for ( let i = 0; i < morphTargetsCount; i ++ ) {
109
62
 
110
- morph.fromBufferAttribute( morphNormal, j );
63
+ const morphTarget = morphTargets[ i ];
64
+ const morphNormal = morphNormals[ i ];
65
+ const morphColor = morphColors[ i ];
111
66
 
112
- buffer[ offset + stride + 4 ] = morph.x;
113
- buffer[ offset + stride + 5 ] = morph.y;
114
- buffer[ offset + stride + 6 ] = morph.z;
115
- buffer[ offset + stride + 7 ] = 0;
67
+ const offset = width * height * 4 * i;
116
68
 
117
- }
69
+ for ( let j = 0; j < morphTarget.count; j ++ ) {
118
70
 
119
- if ( hasMorphColors === true ) {
71
+ const stride = j * vertexDataStride;
120
72
 
121
- morph.fromBufferAttribute( morphColor, j );
73
+ if ( hasMorphPosition === true ) {
122
74
 
123
- buffer[ offset + stride + 8 ] = morph.x;
124
- buffer[ offset + stride + 9 ] = morph.y;
125
- buffer[ offset + stride + 10 ] = morph.z;
126
- buffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;
75
+ morph.fromBufferAttribute( morphTarget, j );
127
76
 
128
- }
77
+ buffer[ offset + stride + 0 ] = morph.x;
78
+ buffer[ offset + stride + 1 ] = morph.y;
79
+ buffer[ offset + stride + 2 ] = morph.z;
80
+ buffer[ offset + stride + 3 ] = 0;
129
81
 
130
82
  }
131
83
 
132
- }
133
-
134
- entry = {
135
- count: morphTargetsCount,
136
- texture: texture,
137
- size: new Vector2( width, height )
138
- };
139
-
140
- morphTextures.set( geometry, entry );
141
-
142
- function disposeTexture() {
143
-
144
- texture.dispose();
145
-
146
- morphTextures.delete( geometry );
147
-
148
- geometry.removeEventListener( 'dispose', disposeTexture );
149
-
150
- }
151
-
152
- geometry.addEventListener( 'dispose', disposeTexture );
84
+ if ( hasMorphNormals === true ) {
153
85
 
154
- }
86
+ morph.fromBufferAttribute( morphNormal, j );
155
87
 
156
- //
157
- if ( object.isInstancedMesh === true && object.morphTexture !== null ) {
88
+ buffer[ offset + stride + 4 ] = morph.x;
89
+ buffer[ offset + stride + 5 ] = morph.y;
90
+ buffer[ offset + stride + 6 ] = morph.z;
91
+ buffer[ offset + stride + 7 ] = 0;
158
92
 
159
- program.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );
93
+ }
160
94
 
161
- } else {
95
+ if ( hasMorphColors === true ) {
162
96
 
163
- let morphInfluencesSum = 0;
97
+ morph.fromBufferAttribute( morphColor, j );
164
98
 
165
- for ( let i = 0; i < objectInfluences.length; i ++ ) {
99
+ buffer[ offset + stride + 8 ] = morph.x;
100
+ buffer[ offset + stride + 9 ] = morph.y;
101
+ buffer[ offset + stride + 10 ] = morph.z;
102
+ buffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;
166
103
 
167
- morphInfluencesSum += objectInfluences[ i ];
104
+ }
168
105
 
169
106
  }
170
107
 
171
- const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;
172
-
173
-
174
- program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
175
- program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );
176
-
177
108
  }
178
109
 
179
- program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );
180
- program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );
181
-
182
- } else {
183
-
184
- // When object doesn't have morph target influences defined, we treat it as a 0-length array
185
- // This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences
110
+ entry = {
111
+ count: morphTargetsCount,
112
+ texture: texture,
113
+ size: new Vector2( width, height )
114
+ };
186
115
 
187
- const length = objectInfluences === undefined ? 0 : objectInfluences.length;
116
+ morphTextures.set( geometry, entry );
188
117
 
189
- let influences = influencesList[ geometry.id ];
118
+ function disposeTexture() {
190
119
 
191
- if ( influences === undefined || influences.length !== length ) {
120
+ texture.dispose();
192
121
 
193
- // initialise list
122
+ morphTextures.delete( geometry );
194
123
 
195
- influences = [];
196
-
197
- for ( let i = 0; i < length; i ++ ) {
198
-
199
- influences[ i ] = [ i, 0 ];
200
-
201
- }
202
-
203
- influencesList[ geometry.id ] = influences;
204
-
205
- }
206
-
207
- // Collect influences
208
-
209
- for ( let i = 0; i < length; i ++ ) {
210
-
211
- const influence = influences[ i ];
212
-
213
- influence[ 0 ] = i;
214
- influence[ 1 ] = objectInfluences[ i ];
124
+ geometry.removeEventListener( 'dispose', disposeTexture );
215
125
 
216
126
  }
217
127
 
218
- influences.sort( absNumericalSort );
128
+ geometry.addEventListener( 'dispose', disposeTexture );
219
129
 
220
- for ( let i = 0; i < 8; i ++ ) {
221
-
222
- if ( i < length && influences[ i ][ 1 ] ) {
223
-
224
- workInfluences[ i ][ 0 ] = influences[ i ][ 0 ];
225
- workInfluences[ i ][ 1 ] = influences[ i ][ 1 ];
226
-
227
- } else {
228
-
229
- workInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;
230
- workInfluences[ i ][ 1 ] = 0;
231
-
232
- }
130
+ }
233
131
 
234
- }
132
+ //
133
+ if ( object.isInstancedMesh === true && object.morphTexture !== null ) {
235
134
 
236
- workInfluences.sort( numericalSort );
135
+ program.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );
237
136
 
238
- const morphTargets = geometry.morphAttributes.position;
239
- const morphNormals = geometry.morphAttributes.normal;
137
+ } else {
240
138
 
241
139
  let morphInfluencesSum = 0;
242
140
 
243
- for ( let i = 0; i < 8; i ++ ) {
244
-
245
- const influence = workInfluences[ i ];
246
- const index = influence[ 0 ];
247
- const value = influence[ 1 ];
248
-
249
- if ( index !== Number.MAX_SAFE_INTEGER && value ) {
141
+ for ( let i = 0; i < objectInfluences.length; i ++ ) {
250
142
 
251
- if ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {
252
-
253
- geometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );
254
-
255
- }
256
-
257
- if ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {
258
-
259
- geometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );
260
-
261
- }
262
-
263
- morphInfluences[ i ] = value;
264
- morphInfluencesSum += value;
265
-
266
- } else {
267
-
268
- if ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {
269
-
270
- geometry.deleteAttribute( 'morphTarget' + i );
271
-
272
- }
273
-
274
- if ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {
275
-
276
- geometry.deleteAttribute( 'morphNormal' + i );
277
-
278
- }
279
-
280
- morphInfluences[ i ] = 0;
281
-
282
- }
143
+ morphInfluencesSum += objectInfluences[ i ];
283
144
 
284
145
  }
285
146
 
286
- // GLSL shader uses formula baseinfluence * base + sum(target * influence)
287
- // This allows us to switch between absolute morphs and relative morphs without changing shader code
288
- // When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)
289
147
  const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;
290
148
 
149
+
291
150
  program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
292
- program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );
151
+ program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );
293
152
 
294
153
  }
295
154
 
155
+ program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );
156
+ program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );
157
+
296
158
  }
297
159
 
298
160
  return {
@@ -142,19 +142,6 @@ function getToneMappingFunction( functionName, toneMapping ) {
142
142
 
143
143
  }
144
144
 
145
- function generateExtensions( parameters ) {
146
-
147
- const chunks = [
148
- ( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.normalMapTangentSpace || parameters.clearcoatNormalMap || parameters.flatShading || parameters.alphaToCoverage || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',
149
- ( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',
150
- ( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',
151
- ( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''
152
- ];
153
-
154
- return chunks.filter( filterEmptyLine ).join( '\n' );
155
-
156
- }
157
-
158
145
  function generateVertexExtensions( parameters ) {
159
146
 
160
147
  const chunks = [
@@ -257,11 +244,7 @@ function resolveIncludes( string ) {
257
244
 
258
245
  }
259
246
 
260
- const shaderChunkMap = new Map( [
261
- [ 'encodings_fragment', 'colorspace_fragment' ], // @deprecated, r154
262
- [ 'encodings_pars_fragment', 'colorspace_pars_fragment' ], // @deprecated, r154
263
- [ 'output_fragment', 'opaque_fragment' ], // @deprecated, r154
264
- ] );
247
+ const shaderChunkMap = new Map();
265
248
 
266
249
  function includeReplacer( match, include ) {
267
250
 
@@ -322,27 +305,21 @@ function generatePrecision( parameters ) {
322
305
  precision ${parameters.precision} int;
323
306
  precision ${parameters.precision} sampler2D;
324
307
  precision ${parameters.precision} samplerCube;
308
+ precision ${parameters.precision} sampler3D;
309
+ precision ${parameters.precision} sampler2DArray;
310
+ precision ${parameters.precision} sampler2DShadow;
311
+ precision ${parameters.precision} samplerCubeShadow;
312
+ precision ${parameters.precision} sampler2DArrayShadow;
313
+ precision ${parameters.precision} isampler2D;
314
+ precision ${parameters.precision} isampler3D;
315
+ precision ${parameters.precision} isamplerCube;
316
+ precision ${parameters.precision} isampler2DArray;
317
+ precision ${parameters.precision} usampler2D;
318
+ precision ${parameters.precision} usampler3D;
319
+ precision ${parameters.precision} usamplerCube;
320
+ precision ${parameters.precision} usampler2DArray;
325
321
  `;
326
322
 
327
- if ( parameters.isWebGL2 ) {
328
-
329
- precisionstring += `precision ${parameters.precision} sampler3D;
330
- precision ${parameters.precision} sampler2DArray;
331
- precision ${parameters.precision} sampler2DShadow;
332
- precision ${parameters.precision} samplerCubeShadow;
333
- precision ${parameters.precision} sampler2DArrayShadow;
334
- precision ${parameters.precision} isampler2D;
335
- precision ${parameters.precision} isampler3D;
336
- precision ${parameters.precision} isamplerCube;
337
- precision ${parameters.precision} isampler2DArray;
338
- precision ${parameters.precision} usampler2D;
339
- precision ${parameters.precision} usampler3D;
340
- precision ${parameters.precision} usamplerCube;
341
- precision ${parameters.precision} usampler2DArray;
342
- `;
343
-
344
- }
345
-
346
323
  if ( parameters.precision === 'highp' ) {
347
324
 
348
325
  precisionstring += '\n#define HIGH_PRECISION';
@@ -491,8 +468,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
491
468
  const envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );
492
469
  const envMapCubeUVSize = generateCubeUVSize( parameters );
493
470
 
494
- const customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );
495
-
496
471
  const customVertexExtensions = generateVertexExtensions( parameters );
497
472
 
498
473
  const customDefines = generateDefines( defines );
@@ -523,8 +498,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
523
498
 
524
499
  prefixFragment = [
525
500
 
526
- customExtensions,
527
-
528
501
  '#define SHADER_TYPE ' + parameters.shaderType,
529
502
  '#define SHADER_NAME ' + parameters.shaderName,
530
503
 
@@ -646,10 +619,10 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
646
619
 
647
620
  parameters.morphTargets ? '#define USE_MORPHTARGETS' : '',
648
621
  parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',
649
- ( parameters.morphColors && parameters.isWebGL2 ) ? '#define USE_MORPHCOLORS' : '',
650
- ( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',
651
- ( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',
652
- ( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',
622
+ ( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',
623
+ ( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE' : '',
624
+ ( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',
625
+ ( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',
653
626
  parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
654
627
  parameters.flipSided ? '#define FLIP_SIDED' : '',
655
628
 
@@ -663,7 +636,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
663
636
  parameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '',
664
637
 
665
638
  parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
666
- ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
667
639
 
668
640
  'uniform mat4 modelMatrix;',
669
641
  'uniform mat4 modelViewMatrix;',
@@ -767,8 +739,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
767
739
 
768
740
  prefixFragment = [
769
741
 
770
- customExtensions,
771
-
772
742
  generatePrecision( parameters ),
773
743
 
774
744
  '#define SHADER_TYPE ' + parameters.shaderType,
@@ -805,6 +775,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
805
775
  parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
806
776
  parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',
807
777
 
778
+ parameters.dispersion ? '#define USE_DISPERSION' : '',
779
+
808
780
  parameters.iridescence ? '#define USE_IRIDESCENCE' : '',
809
781
  parameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',
810
782
  parameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',
@@ -856,7 +828,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
856
828
  parameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',
857
829
 
858
830
  parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
859
- ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
860
831
 
861
832
  'uniform mat4 viewMatrix;',
862
833
  'uniform vec3 cameraPosition;',
@@ -891,7 +862,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
891
862
  vertexShader = unrollLoops( vertexShader );
892
863
  fragmentShader = unrollLoops( fragmentShader );
893
864
 
894
- if ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {
865
+ if ( parameters.isRawShaderMaterial !== true ) {
895
866
 
896
867
  // GLSL 3.0 conversion for built-in materials and ShaderMaterial
897
868
 
@@ -899,14 +870,12 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
899
870
 
900
871
  prefixVertex = [
901
872
  customVertexExtensions,
902
- 'precision mediump sampler2DArray;',
903
873
  '#define attribute in',
904
874
  '#define varying out',
905
875
  '#define texture2D texture'
906
876
  ].join( '\n' ) + '\n' + prefixVertex;
907
877
 
908
878
  prefixFragment = [
909
- 'precision mediump sampler2DArray;',
910
879
  '#define varying in',
911
880
  ( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',
912
881
  ( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',
@@ -13,7 +13,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
13
13
  const _activeChannels = new Set();
14
14
  const programs = [];
15
15
 
16
- const IS_WEBGL2 = capabilities.isWebGL2;
17
16
  const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;
18
17
  const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;
19
18
 
@@ -130,6 +129,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
130
129
 
131
130
  const HAS_ANISOTROPY = material.anisotropy > 0;
132
131
  const HAS_CLEARCOAT = material.clearcoat > 0;
132
+ const HAS_DISPERSION = material.dispersion > 0;
133
133
  const HAS_IRIDESCENCE = material.iridescence > 0;
134
134
  const HAS_SHEEN = material.sheen > 0;
135
135
  const HAS_TRANSMISSION = material.transmission > 0;
@@ -177,8 +177,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
177
177
 
178
178
  const parameters = {
179
179
 
180
- isWebGL2: IS_WEBGL2,
181
-
182
180
  shaderID: shaderID,
183
181
  shaderType: material.type,
184
182
  shaderName: material.name,
@@ -231,6 +229,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
231
229
  clearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,
232
230
  clearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,
233
231
 
232
+ dispersion: HAS_DISPERSION,
233
+
234
234
  iridescence: HAS_IRIDESCENCE,
235
235
  iridescenceMap: HAS_IRIDESCENCEMAP,
236
236
  iridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,
@@ -353,16 +353,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
353
353
 
354
354
  index0AttributeName: material.index0AttributeName,
355
355
 
356
- extensionDerivatives: HAS_EXTENSIONS && material.extensions.derivatives === true,
357
- extensionFragDepth: HAS_EXTENSIONS && material.extensions.fragDepth === true,
358
- extensionDrawBuffers: HAS_EXTENSIONS && material.extensions.drawBuffers === true,
359
- extensionShaderTextureLOD: HAS_EXTENSIONS && material.extensions.shaderTextureLOD === true,
360
356
  extensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),
361
357
  extensionMultiDraw: HAS_EXTENSIONS && material.extensions.multiDraw === true && extensions.has( 'WEBGL_multi_draw' ),
362
358
 
363
- rendererExtensionFragDepth: IS_WEBGL2 || extensions.has( 'EXT_frag_depth' ),
364
- rendererExtensionDrawBuffers: IS_WEBGL2 || extensions.has( 'WEBGL_draw_buffers' ),
365
- rendererExtensionShaderTextureLod: IS_WEBGL2 || extensions.has( 'EXT_shader_texture_lod' ),
366
359
  rendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),
367
360
 
368
361
  customProgramCacheKey: material.customProgramCacheKey()
@@ -478,47 +471,47 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
478
471
 
479
472
  _programLayers.disableAll();
480
473
 
481
- if ( parameters.isWebGL2 )
482
- _programLayers.enable( 0 );
483
474
  if ( parameters.supportsVertexTextures )
484
- _programLayers.enable( 1 );
475
+ _programLayers.enable( 0 );
485
476
  if ( parameters.instancing )
486
- _programLayers.enable( 2 );
477
+ _programLayers.enable( 1 );
487
478
  if ( parameters.instancingColor )
488
- _programLayers.enable( 3 );
479
+ _programLayers.enable( 2 );
489
480
  if ( parameters.instancingMorph )
490
- _programLayers.enable( 4 );
481
+ _programLayers.enable( 3 );
491
482
  if ( parameters.matcap )
492
- _programLayers.enable( 5 );
483
+ _programLayers.enable( 4 );
493
484
  if ( parameters.envMap )
494
- _programLayers.enable( 6 );
485
+ _programLayers.enable( 5 );
495
486
  if ( parameters.normalMapObjectSpace )
496
- _programLayers.enable( 7 );
487
+ _programLayers.enable( 6 );
497
488
  if ( parameters.normalMapTangentSpace )
498
- _programLayers.enable( 8 );
489
+ _programLayers.enable( 7 );
499
490
  if ( parameters.clearcoat )
500
- _programLayers.enable( 9 );
491
+ _programLayers.enable( 8 );
501
492
  if ( parameters.iridescence )
502
- _programLayers.enable( 10 );
493
+ _programLayers.enable( 9 );
503
494
  if ( parameters.alphaTest )
504
- _programLayers.enable( 11 );
495
+ _programLayers.enable( 10 );
505
496
  if ( parameters.vertexColors )
506
- _programLayers.enable( 12 );
497
+ _programLayers.enable( 11 );
507
498
  if ( parameters.vertexAlphas )
508
- _programLayers.enable( 13 );
499
+ _programLayers.enable( 12 );
509
500
  if ( parameters.vertexUv1s )
510
- _programLayers.enable( 14 );
501
+ _programLayers.enable( 13 );
511
502
  if ( parameters.vertexUv2s )
512
- _programLayers.enable( 15 );
503
+ _programLayers.enable( 14 );
513
504
  if ( parameters.vertexUv3s )
514
- _programLayers.enable( 16 );
505
+ _programLayers.enable( 15 );
515
506
  if ( parameters.vertexTangents )
516
- _programLayers.enable( 17 );
507
+ _programLayers.enable( 16 );
517
508
  if ( parameters.anisotropy )
518
- _programLayers.enable( 18 );
509
+ _programLayers.enable( 17 );
519
510
  if ( parameters.alphaHash )
520
- _programLayers.enable( 19 );
511
+ _programLayers.enable( 18 );
521
512
  if ( parameters.batching )
513
+ _programLayers.enable( 19 );
514
+ if ( parameters.dispersion )
522
515
  _programLayers.enable( 20 );
523
516
 
524
517
  array.push( _programLayers.mask );