super-three 0.162.0 → 0.163.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 (122) hide show
  1. package/build/three.cjs +407 -1014
  2. package/build/three.module.js +406 -1013
  3. package/build/three.module.min.js +1 -1
  4. package/examples/jsm/controls/TransformControls.js +3 -3
  5. package/examples/jsm/exporters/GLTFExporter.js +21 -4
  6. package/examples/jsm/exporters/USDZExporter.js +15 -0
  7. package/examples/jsm/geometries/TextGeometry.js +10 -2
  8. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  9. package/examples/jsm/libs/fflate.module.js +694 -496
  10. package/examples/jsm/lines/LineMaterial.js +0 -2
  11. package/examples/jsm/loaders/3MFLoader.js +2 -0
  12. package/examples/jsm/loaders/EXRLoader.js +89 -19
  13. package/examples/jsm/loaders/FBXLoader.js +1 -1
  14. package/examples/jsm/loaders/GLTFLoader.js +6 -0
  15. package/examples/jsm/loaders/KTX2Loader.js +2 -6
  16. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  17. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  18. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  19. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  20. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  21. package/examples/jsm/nodes/Nodes.js +6 -1
  22. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  23. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  24. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
  25. package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
  26. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  27. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  28. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  29. package/examples/jsm/nodes/accessors/TextureNode.js +30 -7
  30. package/examples/jsm/nodes/core/Node.js +55 -4
  31. package/examples/jsm/nodes/core/NodeBuilder.js +21 -16
  32. package/examples/jsm/nodes/core/NodeFrame.js +10 -10
  33. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  34. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  35. package/examples/jsm/nodes/display/PassNode.js +17 -1
  36. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  37. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  38. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  39. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  40. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  41. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  42. package/examples/jsm/nodes/lighting/EnvironmentNode.js +12 -69
  43. package/examples/jsm/nodes/materials/NodeMaterial.js +33 -11
  44. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  45. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  46. package/examples/jsm/nodes/shadernode/ShaderNode.js +1 -1
  47. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  48. package/examples/jsm/objects/QuadMesh.js +7 -23
  49. package/examples/jsm/physics/RapierPhysics.js +4 -4
  50. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  51. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  52. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  53. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  54. package/examples/jsm/renderers/common/Animation.js +3 -0
  55. package/examples/jsm/renderers/common/Background.js +5 -5
  56. package/examples/jsm/renderers/common/Info.js +11 -19
  57. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  58. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  59. package/examples/jsm/renderers/common/RenderObject.js +4 -4
  60. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  61. package/examples/jsm/renderers/common/Renderer.js +25 -8
  62. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +777 -0
  63. package/examples/jsm/renderers/common/nodes/Nodes.js +5 -18
  64. package/examples/jsm/renderers/webgl/WebGLBackend.js +148 -24
  65. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +141 -0
  66. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +3 -3
  67. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
  68. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  69. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +43 -0
  70. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
  71. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -2
  72. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -2
  73. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +54 -25
  74. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +5 -3
  75. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +25 -0
  76. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  77. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
  78. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  79. package/examples/jsm/utils/TextureUtils.js +1 -1
  80. package/package.json +1 -1
  81. package/src/Three.js +0 -1
  82. package/src/animation/AnimationClip.js +1 -1
  83. package/src/constants.js +3 -3
  84. package/src/core/Object3D.js +10 -7
  85. package/src/extras/PMREMGenerator.js +9 -0
  86. package/src/loaders/ObjectLoader.js +2 -0
  87. package/src/materials/ShaderMaterial.js +0 -4
  88. package/src/math/Spherical.js +4 -5
  89. package/src/objects/BatchedMesh.js +4 -3
  90. package/src/objects/InstancedMesh.js +10 -0
  91. package/src/renderers/WebGLRenderer.js +55 -114
  92. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  93. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  94. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  95. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  96. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  97. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  98. package/src/renderers/shaders/ShaderLib.js +1 -1
  99. package/src/renderers/shaders/UniformsUtils.js +10 -1
  100. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  101. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  102. package/src/renderers/webgl/WebGLBufferRenderer.js +3 -25
  103. package/src/renderers/webgl/WebGLCapabilities.js +2 -12
  104. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  105. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  106. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +3 -25
  107. package/src/renderers/webgl/WebGLLights.js +6 -32
  108. package/src/renderers/webgl/WebGLMaterials.js +2 -3
  109. package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
  110. package/src/renderers/webgl/WebGLProgram.js +18 -47
  111. package/src/renderers/webgl/WebGLPrograms.js +20 -32
  112. package/src/renderers/webgl/WebGLRenderStates.js +8 -6
  113. package/src/renderers/webgl/WebGLState.js +15 -59
  114. package/src/renderers/webgl/WebGLTextures.js +75 -237
  115. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  116. package/src/renderers/webgl/WebGLUtils.js +6 -57
  117. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  118. package/src/renderers/webxr/WebXRManager.js +2 -2
  119. package/src/scenes/Scene.js +7 -1
  120. package/src/textures/Texture.js +11 -1
  121. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  122. package/src/renderers/WebGL1Renderer.js +0 -7
@@ -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 = [
@@ -322,27 +309,21 @@ function generatePrecision( parameters ) {
322
309
  precision ${parameters.precision} int;
323
310
  precision ${parameters.precision} sampler2D;
324
311
  precision ${parameters.precision} samplerCube;
312
+ precision ${parameters.precision} sampler3D;
313
+ precision ${parameters.precision} sampler2DArray;
314
+ precision ${parameters.precision} sampler2DShadow;
315
+ precision ${parameters.precision} samplerCubeShadow;
316
+ precision ${parameters.precision} sampler2DArrayShadow;
317
+ precision ${parameters.precision} isampler2D;
318
+ precision ${parameters.precision} isampler3D;
319
+ precision ${parameters.precision} isamplerCube;
320
+ precision ${parameters.precision} isampler2DArray;
321
+ precision ${parameters.precision} usampler2D;
322
+ precision ${parameters.precision} usampler3D;
323
+ precision ${parameters.precision} usamplerCube;
324
+ precision ${parameters.precision} usampler2DArray;
325
325
  `;
326
326
 
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
327
  if ( parameters.precision === 'highp' ) {
347
328
 
348
329
  precisionstring += '\n#define HIGH_PRECISION';
@@ -491,8 +472,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
491
472
  const envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );
492
473
  const envMapCubeUVSize = generateCubeUVSize( parameters );
493
474
 
494
- const customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );
495
-
496
475
  const customVertexExtensions = generateVertexExtensions( parameters );
497
476
 
498
477
  const customDefines = generateDefines( defines );
@@ -523,8 +502,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
523
502
 
524
503
  prefixFragment = [
525
504
 
526
- customExtensions,
527
-
528
505
  '#define SHADER_TYPE ' + parameters.shaderType,
529
506
  '#define SHADER_NAME ' + parameters.shaderName,
530
507
 
@@ -646,10 +623,10 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
646
623
 
647
624
  parameters.morphTargets ? '#define USE_MORPHTARGETS' : '',
648
625
  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 : '',
626
+ ( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',
627
+ ( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE' : '',
628
+ ( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',
629
+ ( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',
653
630
  parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
654
631
  parameters.flipSided ? '#define FLIP_SIDED' : '',
655
632
 
@@ -663,7 +640,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
663
640
  parameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '',
664
641
 
665
642
  parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
666
- ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
667
643
 
668
644
  'uniform mat4 modelMatrix;',
669
645
  'uniform mat4 modelViewMatrix;',
@@ -767,8 +743,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
767
743
 
768
744
  prefixFragment = [
769
745
 
770
- customExtensions,
771
-
772
746
  generatePrecision( parameters ),
773
747
 
774
748
  '#define SHADER_TYPE ' + parameters.shaderType,
@@ -856,7 +830,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
856
830
  parameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',
857
831
 
858
832
  parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
859
- ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
860
833
 
861
834
  'uniform mat4 viewMatrix;',
862
835
  'uniform vec3 cameraPosition;',
@@ -891,7 +864,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
891
864
  vertexShader = unrollLoops( vertexShader );
892
865
  fragmentShader = unrollLoops( fragmentShader );
893
866
 
894
- if ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {
867
+ if ( parameters.isRawShaderMaterial !== true ) {
895
868
 
896
869
  // GLSL 3.0 conversion for built-in materials and ShaderMaterial
897
870
 
@@ -899,14 +872,12 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
899
872
 
900
873
  prefixVertex = [
901
874
  customVertexExtensions,
902
- 'precision mediump sampler2DArray;',
903
875
  '#define attribute in',
904
876
  '#define varying out',
905
877
  '#define texture2D texture'
906
878
  ].join( '\n' ) + '\n' + prefixVertex;
907
879
 
908
880
  prefixFragment = [
909
- 'precision mediump sampler2DArray;',
910
881
  '#define varying in',
911
882
  ( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',
912
883
  ( 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
 
@@ -177,8 +176,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
177
176
 
178
177
  const parameters = {
179
178
 
180
- isWebGL2: IS_WEBGL2,
181
-
182
179
  shaderID: shaderID,
183
180
  shaderType: material.type,
184
181
  shaderName: material.name,
@@ -353,16 +350,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
353
350
 
354
351
  index0AttributeName: material.index0AttributeName,
355
352
 
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
353
  extensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),
361
354
  extensionMultiDraw: HAS_EXTENSIONS && material.extensions.multiDraw === true && extensions.has( 'WEBGL_multi_draw' ),
362
355
 
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
356
  rendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),
367
357
 
368
358
  customProgramCacheKey: material.customProgramCacheKey()
@@ -478,48 +468,46 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
478
468
 
479
469
  _programLayers.disableAll();
480
470
 
481
- if ( parameters.isWebGL2 )
482
- _programLayers.enable( 0 );
483
471
  if ( parameters.supportsVertexTextures )
484
- _programLayers.enable( 1 );
472
+ _programLayers.enable( 0 );
485
473
  if ( parameters.instancing )
486
- _programLayers.enable( 2 );
474
+ _programLayers.enable( 1 );
487
475
  if ( parameters.instancingColor )
488
- _programLayers.enable( 3 );
476
+ _programLayers.enable( 2 );
489
477
  if ( parameters.instancingMorph )
490
- _programLayers.enable( 4 );
478
+ _programLayers.enable( 3 );
491
479
  if ( parameters.matcap )
492
- _programLayers.enable( 5 );
480
+ _programLayers.enable( 4 );
493
481
  if ( parameters.envMap )
494
- _programLayers.enable( 6 );
482
+ _programLayers.enable( 5 );
495
483
  if ( parameters.normalMapObjectSpace )
496
- _programLayers.enable( 7 );
484
+ _programLayers.enable( 6 );
497
485
  if ( parameters.normalMapTangentSpace )
498
- _programLayers.enable( 8 );
486
+ _programLayers.enable( 7 );
499
487
  if ( parameters.clearcoat )
500
- _programLayers.enable( 9 );
488
+ _programLayers.enable( 8 );
501
489
  if ( parameters.iridescence )
502
- _programLayers.enable( 10 );
490
+ _programLayers.enable( 9 );
503
491
  if ( parameters.alphaTest )
504
- _programLayers.enable( 11 );
492
+ _programLayers.enable( 10 );
505
493
  if ( parameters.vertexColors )
506
- _programLayers.enable( 12 );
494
+ _programLayers.enable( 11 );
507
495
  if ( parameters.vertexAlphas )
508
- _programLayers.enable( 13 );
496
+ _programLayers.enable( 12 );
509
497
  if ( parameters.vertexUv1s )
510
- _programLayers.enable( 14 );
498
+ _programLayers.enable( 13 );
511
499
  if ( parameters.vertexUv2s )
512
- _programLayers.enable( 15 );
500
+ _programLayers.enable( 14 );
513
501
  if ( parameters.vertexUv3s )
514
- _programLayers.enable( 16 );
502
+ _programLayers.enable( 15 );
515
503
  if ( parameters.vertexTangents )
516
- _programLayers.enable( 17 );
504
+ _programLayers.enable( 16 );
517
505
  if ( parameters.anisotropy )
518
- _programLayers.enable( 18 );
506
+ _programLayers.enable( 17 );
519
507
  if ( parameters.alphaHash )
520
- _programLayers.enable( 19 );
508
+ _programLayers.enable( 18 );
521
509
  if ( parameters.batching )
522
- _programLayers.enable( 20 );
510
+ _programLayers.enable( 19 );
523
511
 
524
512
  array.push( _programLayers.mask );
525
513
  _programLayers.disableAll();
@@ -1,8 +1,8 @@
1
1
  import { WebGLLights } from './WebGLLights.js';
2
2
 
3
- function WebGLRenderState( extensions, capabilities ) {
3
+ function WebGLRenderState( extensions ) {
4
4
 
5
- const lights = new WebGLLights( extensions, capabilities );
5
+ const lights = new WebGLLights( extensions );
6
6
 
7
7
  const lightsArray = [];
8
8
  const shadowsArray = [];
@@ -42,7 +42,9 @@ function WebGLRenderState( extensions, capabilities ) {
42
42
  lightsArray: lightsArray,
43
43
  shadowsArray: shadowsArray,
44
44
 
45
- lights: lights
45
+ lights: lights,
46
+
47
+ transmissionRenderTarget: null
46
48
  };
47
49
 
48
50
  return {
@@ -57,7 +59,7 @@ function WebGLRenderState( extensions, capabilities ) {
57
59
 
58
60
  }
59
61
 
60
- function WebGLRenderStates( extensions, capabilities ) {
62
+ function WebGLRenderStates( extensions ) {
61
63
 
62
64
  let renderStates = new WeakMap();
63
65
 
@@ -68,14 +70,14 @@ function WebGLRenderStates( extensions, capabilities ) {
68
70
 
69
71
  if ( renderStateArray === undefined ) {
70
72
 
71
- renderState = new WebGLRenderState( extensions, capabilities );
73
+ renderState = new WebGLRenderState( extensions );
72
74
  renderStates.set( scene, [ renderState ] );
73
75
 
74
76
  } else {
75
77
 
76
78
  if ( renderCallDepth >= renderStateArray.length ) {
77
79
 
78
- renderState = new WebGLRenderState( extensions, capabilities );
80
+ renderState = new WebGLRenderState( extensions );
79
81
  renderStateArray.push( renderState );
80
82
 
81
83
  } else {