super-three 0.133.2 → 0.135.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 (246) hide show
  1. package/build/three.js +619 -538
  2. package/build/three.min.js +1 -1
  3. package/build/three.module.js +763 -616
  4. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff +0 -0
  5. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  6. package/examples/fonts/open-sans/open-sans.css +9 -0
  7. package/examples/fonts/tabler-icons/fonts/tabler-icons.eot +0 -0
  8. package/examples/fonts/tabler-icons/fonts/tabler-icons.ttf +0 -0
  9. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff +0 -0
  10. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff2 +0 -0
  11. package/examples/fonts/tabler-icons/tabler-icons.min.css +4 -0
  12. package/examples/js/controls/ArcballControls.js +68 -27
  13. package/examples/js/controls/DragControls.js +7 -0
  14. package/examples/js/controls/OrbitControls.js +5 -36
  15. package/examples/js/controls/TrackballControls.js +3 -2
  16. package/examples/js/csm/CSM.js +2 -2
  17. package/examples/js/csm/CSMFrustum.js +133 -0
  18. package/examples/js/exporters/GLTFExporter.js +147 -63
  19. package/examples/js/exporters/USDZExporter.js +45 -26
  20. package/examples/js/lines/LineMaterial.js +58 -20
  21. package/examples/js/lines/LineSegments2.js +29 -24
  22. package/examples/js/loaders/3DMLoader.js +24 -11
  23. package/examples/js/loaders/3MFLoader.js +2 -2
  24. package/examples/js/loaders/ColladaLoader.js +61 -3
  25. package/examples/js/loaders/FBXLoader.js +1 -1
  26. package/examples/js/loaders/GLTFLoader.js +94 -31
  27. package/examples/js/loaders/KTX2Loader.js +12 -0
  28. package/examples/js/loaders/LWOLoader.js +8 -6
  29. package/examples/js/loaders/LogLuvLoader.js +766 -0
  30. package/examples/js/loaders/PLYLoader.js +32 -7
  31. package/examples/js/loaders/RGBELoader.js +2 -1
  32. package/examples/js/loaders/SVGLoader.js +7 -3
  33. package/examples/js/loaders/TDSLoader.js +237 -271
  34. package/examples/js/loaders/lwo/LWO2Parser.js +1 -0
  35. package/examples/js/loaders/lwo/LWO3Parser.js +4 -2
  36. package/examples/js/objects/MarchingCubes.js +42 -128
  37. package/examples/js/renderers/CSS2DRenderer.js +4 -4
  38. package/examples/js/renderers/CSS3DRenderer.js +4 -4
  39. package/examples/js/utils/RoughnessMipmapper.js +1 -0
  40. package/examples/jsm/controls/ArcballControls.js +61 -29
  41. package/examples/jsm/controls/DragControls.js +7 -0
  42. package/examples/jsm/controls/OrbitControls.js +9 -51
  43. package/examples/jsm/controls/TrackballControls.js +1 -1
  44. package/examples/jsm/csm/CSM.js +3 -3
  45. package/examples/jsm/csm/{Frustum.js → CSMFrustum.js} +3 -3
  46. package/examples/jsm/exporters/GLTFExporter.js +160 -74
  47. package/examples/jsm/exporters/USDZExporter.js +47 -26
  48. package/examples/jsm/libs/flow.module.js +3218 -0
  49. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  50. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  51. package/examples/jsm/lines/LineMaterial.js +59 -23
  52. package/examples/jsm/lines/LineSegments2.js +22 -18
  53. package/examples/jsm/loaders/3DMLoader.js +18 -12
  54. package/examples/jsm/loaders/3MFLoader.js +2 -2
  55. package/examples/jsm/loaders/ColladaLoader.js +61 -3
  56. package/examples/jsm/loaders/FBXLoader.js +1 -1
  57. package/examples/jsm/loaders/GLTFLoader.js +99 -35
  58. package/examples/jsm/loaders/KTX2Loader.js +19 -0
  59. package/examples/jsm/loaders/LWOLoader.js +8 -6
  60. package/examples/jsm/loaders/LogLuvLoader.js +606 -0
  61. package/examples/jsm/loaders/PLYLoader.js +33 -7
  62. package/examples/jsm/loaders/SVGLoader.js +7 -4
  63. package/examples/jsm/loaders/TDSLoader.js +225 -285
  64. package/examples/jsm/loaders/lwo/LWO2Parser.js +1 -0
  65. package/examples/jsm/loaders/lwo/LWO3Parser.js +2 -2
  66. package/examples/jsm/node-editor/NodeEditor.js +455 -0
  67. package/examples/jsm/node-editor/accessors/NormalEditor.js +30 -0
  68. package/examples/jsm/node-editor/accessors/PositionEditor.js +30 -0
  69. package/examples/jsm/node-editor/accessors/UVEditor.js +26 -0
  70. package/examples/jsm/node-editor/display/BlendEditor.js +43 -0
  71. package/examples/jsm/node-editor/examples/animate-uv.json +1 -0
  72. package/examples/jsm/node-editor/examples/fake-top-light.json +1 -0
  73. package/examples/jsm/node-editor/examples/oscillator-color.json +1 -0
  74. package/examples/jsm/node-editor/examples/rim.json +1 -0
  75. package/examples/jsm/node-editor/inputs/ColorEditor.js +91 -0
  76. package/examples/jsm/node-editor/inputs/FloatEditor.js +24 -0
  77. package/examples/jsm/node-editor/inputs/SliderEditor.js +68 -0
  78. package/examples/jsm/node-editor/inputs/Vector2Editor.js +28 -0
  79. package/examples/jsm/node-editor/inputs/Vector3Editor.js +30 -0
  80. package/examples/jsm/node-editor/inputs/Vector4Editor.js +37 -0
  81. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +69 -0
  82. package/examples/jsm/node-editor/math/DotEditor.js +36 -0
  83. package/examples/jsm/node-editor/math/InvertEditor.js +38 -0
  84. package/examples/jsm/node-editor/math/LimiterEditor.js +48 -0
  85. package/examples/jsm/node-editor/math/NormalizeEditor.js +26 -0
  86. package/examples/jsm/node-editor/math/OperatorEditor.js +50 -0
  87. package/examples/jsm/node-editor/math/PowerEditor.js +34 -0
  88. package/examples/jsm/node-editor/math/TrigonometryEditor.js +39 -0
  89. package/examples/jsm/node-editor/procedural/CheckerEditor.js +26 -0
  90. package/examples/jsm/node-editor/utils/OscillatorEditor.js +42 -0
  91. package/examples/jsm/node-editor/utils/TimerEditor.js +57 -0
  92. package/examples/jsm/nodes/materials/StandardNodeMaterial.js +1 -1
  93. package/examples/jsm/nodes/materials/nodes/StandardNode.js +6 -6
  94. package/examples/jsm/nodes/utils/ColorSpaceNode.js +1 -49
  95. package/examples/jsm/objects/MarchingCubes.js +46 -152
  96. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +1 -1
  97. package/examples/jsm/postprocessing/AfterimagePass.js +1 -1
  98. package/examples/jsm/postprocessing/BloomPass.js +1 -1
  99. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  100. package/examples/jsm/postprocessing/ClearPass.js +1 -1
  101. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -1
  102. package/examples/jsm/postprocessing/DotScreenPass.js +1 -1
  103. package/examples/jsm/postprocessing/EffectComposer.js +3 -3
  104. package/examples/jsm/postprocessing/FilmPass.js +1 -1
  105. package/examples/jsm/postprocessing/GlitchPass.js +1 -1
  106. package/examples/jsm/postprocessing/HalftonePass.js +1 -1
  107. package/examples/jsm/postprocessing/MaskPass.js +1 -1
  108. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  109. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  110. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  111. package/examples/jsm/postprocessing/SMAAPass.js +1 -1
  112. package/examples/jsm/postprocessing/SSAARenderPass.js +1 -1
  113. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  114. package/examples/jsm/postprocessing/SSRPass.js +1 -1
  115. package/examples/jsm/postprocessing/SSRrPass.js +1 -1
  116. package/examples/jsm/postprocessing/SavePass.js +1 -1
  117. package/examples/jsm/postprocessing/ShaderPass.js +1 -1
  118. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  119. package/examples/jsm/postprocessing/TexturePass.js +1 -1
  120. package/examples/jsm/postprocessing/UnrealBloomPass.js +1 -1
  121. package/examples/jsm/renderers/CSS2DRenderer.js +5 -4
  122. package/examples/jsm/renderers/CSS3DRenderer.js +5 -4
  123. package/examples/jsm/renderers/nodes/Nodes.js +14 -13
  124. package/examples/jsm/renderers/nodes/ShaderNode.js +193 -41
  125. package/examples/jsm/renderers/nodes/accessors/MaterialNode.js +6 -6
  126. package/examples/jsm/renderers/nodes/accessors/ModelViewProjectionNode.js +5 -5
  127. package/examples/jsm/renderers/nodes/accessors/NormalNode.js +14 -3
  128. package/examples/jsm/renderers/nodes/accessors/PointUVNode.js +3 -3
  129. package/examples/jsm/renderers/nodes/accessors/PositionNode.js +15 -5
  130. package/examples/jsm/renderers/nodes/accessors/SkinningNode.js +107 -0
  131. package/examples/jsm/renderers/nodes/accessors/UVNode.js +7 -5
  132. package/examples/jsm/renderers/nodes/core/ArrayInputNode.js +3 -3
  133. package/examples/jsm/renderers/nodes/core/AttributeNode.js +6 -0
  134. package/examples/jsm/renderers/nodes/core/BypassNode.js +38 -0
  135. package/examples/jsm/renderers/nodes/core/CodeNode.js +3 -3
  136. package/examples/jsm/renderers/nodes/core/ContextNode.js +4 -19
  137. package/examples/jsm/renderers/nodes/core/ExpressionNode.js +13 -2
  138. package/examples/jsm/renderers/nodes/core/FunctionNode.js +19 -132
  139. package/examples/jsm/renderers/nodes/core/InputNode.js +13 -3
  140. package/examples/jsm/renderers/nodes/core/Node.js +32 -10
  141. package/examples/jsm/renderers/nodes/core/NodeBuilder.js +146 -128
  142. package/examples/jsm/renderers/nodes/core/NodeFunction.js +22 -0
  143. package/examples/jsm/renderers/nodes/core/NodeFunctionInput.js +4 -4
  144. package/examples/jsm/renderers/nodes/core/NodeKeywords.js +18 -179
  145. package/examples/jsm/renderers/nodes/core/NodeParser.js +11 -0
  146. package/examples/jsm/renderers/nodes/core/NodeVar.js +2 -2
  147. package/examples/jsm/renderers/nodes/core/PropertyNode.js +14 -2
  148. package/examples/jsm/renderers/nodes/core/TempNode.js +10 -13
  149. package/examples/jsm/renderers/nodes/core/VarNode.js +12 -7
  150. package/examples/jsm/renderers/nodes/core/VaryNode.js +23 -8
  151. package/examples/jsm/renderers/nodes/core/constants.js +2 -0
  152. package/examples/jsm/renderers/nodes/display/ColorSpaceNode.js +47 -25
  153. package/examples/jsm/renderers/nodes/display/NormalMapNode.js +21 -22
  154. package/examples/jsm/renderers/nodes/functions/BSDFs.js +64 -101
  155. package/examples/jsm/renderers/nodes/inputs/BufferNode.js +25 -0
  156. package/examples/jsm/renderers/nodes/inputs/IntNode.js +17 -0
  157. package/examples/jsm/renderers/nodes/inputs/TextureNode.js +10 -2
  158. package/examples/jsm/renderers/nodes/lights/LightContextNode.js +20 -14
  159. package/examples/jsm/renderers/nodes/lights/LightNode.js +32 -36
  160. package/examples/jsm/renderers/nodes/math/CondNode.js +60 -0
  161. package/examples/jsm/renderers/nodes/math/MathNode.js +87 -36
  162. package/examples/jsm/renderers/nodes/math/OperatorNode.js +124 -31
  163. package/examples/jsm/renderers/nodes/parsers/GLSLNodeFunction.js +137 -0
  164. package/examples/jsm/renderers/nodes/parsers/GLSLNodeParser.js +14 -0
  165. package/examples/jsm/renderers/nodes/parsers/WGSLNodeFunction.js +89 -0
  166. package/examples/jsm/renderers/nodes/parsers/WGSLNodeParser.js +14 -0
  167. package/examples/jsm/renderers/nodes/procedural/CheckerNode.js +7 -9
  168. package/examples/jsm/renderers/nodes/utils/ArrayElementNode.js +31 -0
  169. package/examples/jsm/renderers/nodes/utils/ConvertNode.js +33 -0
  170. package/examples/jsm/renderers/nodes/utils/JoinNode.js +7 -7
  171. package/examples/jsm/renderers/nodes/utils/OscNode.js +58 -0
  172. package/examples/jsm/renderers/nodes/utils/SplitNode.js +18 -8
  173. package/examples/jsm/renderers/nodes/utils/SpriteSheetUVNode.js +7 -7
  174. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +22 -0
  175. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +191 -94
  176. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +2 -2
  177. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +2 -2
  178. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +1 -1
  179. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +3 -3
  180. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +2 -4
  181. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +2 -4
  182. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +15 -23
  183. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +3 -5
  184. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +11 -27
  185. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +62 -28
  186. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +34 -27
  187. package/examples/jsm/renderers/webgpu/constants.js +2 -2
  188. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +430 -98
  189. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +1 -1
  190. package/examples/jsm/utils/RoughnessMipmapper.js +1 -0
  191. package/examples/jsm/webxr/OculusHandPointerModel.js +6 -6
  192. package/package.json +10 -10
  193. package/src/Three.Legacy.js +6 -0
  194. package/src/Three.js +0 -1
  195. package/src/cameras/StereoCamera.js +8 -7
  196. package/src/constants.js +1 -2
  197. package/src/core/Layers.js +7 -1
  198. package/src/core/Object3D.js +2 -0
  199. package/src/extras/PMREMGenerator.js +11 -6
  200. package/src/loaders/FileLoader.js +89 -152
  201. package/src/loaders/ImageLoader.js +9 -4
  202. package/src/loaders/LoaderUtils.js +26 -0
  203. package/src/loaders/MaterialLoader.js +7 -4
  204. package/src/loaders/ObjectLoader.js +2 -0
  205. package/src/materials/Material.js +4 -4
  206. package/src/materials/MeshPhysicalMaterial.js +20 -14
  207. package/src/math/MathUtils.js +5 -16
  208. package/src/renderers/WebGLMultisampleRenderTarget.js +7 -1
  209. package/src/renderers/WebGLRenderer.js +83 -117
  210. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +2 -2
  211. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +0 -27
  212. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  213. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +19 -6
  214. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
  215. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  216. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +1 -1
  217. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +13 -5
  218. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +2 -1
  219. package/src/renderers/shaders/ShaderLib.js +6 -4
  220. package/src/renderers/shaders/UniformsLib.js +1 -2
  221. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  222. package/src/renderers/webgl/WebGLMaterials.js +27 -15
  223. package/src/renderers/webgl/WebGLProgram.js +10 -6
  224. package/src/renderers/webgl/WebGLPrograms.js +17 -12
  225. package/src/renderers/webgl/WebGLShadowMap.js +14 -5
  226. package/src/renderers/webgl/WebGLState.js +31 -17
  227. package/src/renderers/webgl/WebGLTextures.js +188 -51
  228. package/src/renderers/webgl/WebGLUniforms.js +45 -1
  229. package/src/renderers/webxr/WebXRManager.js +71 -110
  230. package/src/textures/Texture.js +6 -0
  231. package/src/utils.js +37 -1
  232. package/examples/js/controls/DeviceOrientationControls.js +0 -147
  233. package/examples/js/libs/dat.gui.min.js +0 -14
  234. package/examples/jsm/controls/DeviceOrientationControls.js +0 -153
  235. package/examples/jsm/libs/dat.gui.module.js +0 -3575
  236. package/examples/jsm/libs/glslang.js +0 -78
  237. package/examples/jsm/libs/glslang.wasm +0 -0
  238. package/examples/jsm/renderers/nodes/consts/MathConsts.js +0 -7
  239. package/examples/jsm/renderers/nodes/core/ConstNode.js +0 -39
  240. package/examples/jsm/renderers/nodes/core/NodeSlot.js +0 -13
  241. package/examples/jsm/renderers/nodes/core/StructNode.js +0 -80
  242. package/examples/jsm/renderers/nodes/core/StructVarNode.js +0 -75
  243. package/examples/jsm/renderers/nodes/functions/EncodingFunctions.js +0 -99
  244. package/examples/jsm/renderers/nodes/functions/MathFunctions.js +0 -47
  245. package/examples/jsm/renderers/webgpu/nodes/ShaderLib.js +0 -152
  246. package/src/extras/objects/ImmediateRenderObject.js +0 -31
@@ -1,4 +1,4 @@
1
- import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBFormat, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, sRGBEncoding } from '../../constants.js';
1
+ import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBFormat, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping } from '../../constants.js';
2
2
  import * as MathUtils from '../../math/MathUtils.js';
3
3
  import { createElementNS } from '../../utils.js';
4
4
 
@@ -9,6 +9,8 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
9
9
  const maxCubemapSize = capabilities.maxCubemapSize;
10
10
  const maxTextureSize = capabilities.maxTextureSize;
11
11
  const maxSamples = capabilities.maxSamples;
12
+ const hasMultisampledRenderToTexture = extensions.has( 'WEBGL_multisampled_render_to_texture' );
13
+ const MultisampledRenderToTextureExtension = hasMultisampledRenderToTexture ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : undefined;
12
14
 
13
15
  const _videoTextures = new WeakMap();
14
16
  let _canvas;
@@ -122,17 +124,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
122
124
 
123
125
  }
124
126
 
125
- function generateMipmap( target, texture, width, height, depth = 1 ) {
127
+ function generateMipmap( target ) {
126
128
 
127
129
  _gl.generateMipmap( target );
128
130
 
129
- const textureProperties = properties.get( texture );
130
-
131
- textureProperties.__maxMipLevel = Math.log2( Math.max( width, height, depth ) );
132
-
133
131
  }
134
132
 
135
- function getInternalFormat( internalFormatName, glFormat, glType, encoding ) {
133
+ function getInternalFormat( internalFormatName, glFormat, glType/*, encoding*/ ) {
136
134
 
137
135
  if ( isWebGL2 === false ) return glFormat;
138
136
 
@@ -166,7 +164,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
166
164
 
167
165
  if ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;
168
166
  if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;
169
- if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( encoding === sRGBEncoding ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;
167
+ //if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( encoding === sRGBEncoding ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;
168
+ if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8;
169
+
170
170
 
171
171
  }
172
172
 
@@ -181,6 +181,30 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
181
181
 
182
182
  }
183
183
 
184
+ function getMipLevels( texture, image, supportsMips ) {
185
+
186
+ if ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true ) {
187
+
188
+ // generated mipmaps via gl.generateMipmap()
189
+
190
+ return Math.log2( Math.max( image.width, image.height ) ) + 1;
191
+
192
+ } else if ( texture.mipmaps.length > 0 ) {
193
+
194
+ // user-defined mipmaps
195
+
196
+ return texture.mipmaps.length;
197
+
198
+ } else {
199
+
200
+ // texture without mipmaps (only base level)
201
+
202
+ return 1;
203
+
204
+ }
205
+
206
+ }
207
+
184
208
  // Fallback filters for non-power-of-2 textures
185
209
 
186
210
  function filterFallback( f ) {
@@ -633,12 +657,10 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
633
657
  }
634
658
 
635
659
  texture.generateMipmaps = false;
636
- textureProperties.__maxMipLevel = mipmaps.length - 1;
637
660
 
638
661
  } else {
639
662
 
640
663
  state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );
641
- textureProperties.__maxMipLevel = 0;
642
664
 
643
665
  }
644
666
 
@@ -668,17 +690,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
668
690
 
669
691
  }
670
692
 
671
- textureProperties.__maxMipLevel = mipmaps.length - 1;
672
-
673
693
  } else if ( texture.isDataTexture2DArray ) {
674
694
 
675
695
  state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
676
- textureProperties.__maxMipLevel = 0;
677
696
 
678
697
  } else if ( texture.isDataTexture3D ) {
679
698
 
680
699
  state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
681
- textureProperties.__maxMipLevel = 0;
682
700
 
683
701
  } else {
684
702
 
@@ -688,22 +706,53 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
688
706
  // if there are no manual mipmaps
689
707
  // set 0 level mipmap and then use GL to generate other mipmap levels
690
708
 
709
+ const levels = getMipLevels( texture, image, supportsMips );
710
+ const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
711
+ const allocateMemory = ( textureProperties.__version === undefined );
712
+
691
713
  if ( mipmaps.length > 0 && supportsMips ) {
692
714
 
715
+ if ( useTexStorage && allocateMemory ) {
716
+
717
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
718
+
719
+ }
720
+
693
721
  for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
694
722
 
695
723
  mipmap = mipmaps[ i ];
696
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
724
+
725
+ if ( useTexStorage ) {
726
+
727
+ state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );
728
+
729
+ } else {
730
+
731
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
732
+
733
+ }
697
734
 
698
735
  }
699
736
 
700
737
  texture.generateMipmaps = false;
701
- textureProperties.__maxMipLevel = mipmaps.length - 1;
702
738
 
703
739
  } else {
704
740
 
705
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
706
- textureProperties.__maxMipLevel = 0;
741
+ if ( useTexStorage ) {
742
+
743
+ if ( allocateMemory ) {
744
+
745
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
746
+
747
+ }
748
+
749
+ state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );
750
+
751
+ } else {
752
+
753
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
754
+
755
+ }
707
756
 
708
757
  }
709
758
 
@@ -711,7 +760,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
711
760
 
712
761
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
713
762
 
714
- generateMipmap( textureType, texture, image.width, image.height );
763
+ generateMipmap( textureType );
715
764
 
716
765
  }
717
766
 
@@ -796,8 +845,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
796
845
 
797
846
  }
798
847
 
799
- textureProperties.__maxMipLevel = mipmaps.length - 1;
800
-
801
848
  } else {
802
849
 
803
850
  mipmaps = texture.mipmaps;
@@ -833,14 +880,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
833
880
 
834
881
  }
835
882
 
836
- textureProperties.__maxMipLevel = mipmaps.length;
837
-
838
883
  }
839
884
 
840
885
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
841
886
 
842
887
  // We assume images for cube map have the same size.
843
- generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height );
888
+ generateMipmap( _gl.TEXTURE_CUBE_MAP );
844
889
 
845
890
  }
846
891
 
@@ -858,23 +903,38 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
858
903
  const glFormat = utils.convert( texture.format );
859
904
  const glType = utils.convert( texture.type );
860
905
  const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
906
+ const renderTargetProperties = properties.get( renderTarget );
861
907
 
862
- if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
908
+ if ( ! renderTargetProperties.__hasExternalTextures ) {
863
909
 
864
- state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
910
+ if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
865
911
 
866
- } else {
912
+ state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
913
+
914
+ } else {
867
915
 
868
- state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
916
+ state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
917
+
918
+ }
869
919
 
870
920
  }
871
921
 
872
922
  state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
873
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
923
+ if ( renderTarget.useRenderToTexture ) {
924
+
925
+ MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );
926
+
927
+ } else {
928
+
929
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
930
+
931
+ }
932
+
874
933
  state.bindFramebuffer( _gl.FRAMEBUFFER, null );
875
934
 
876
935
  }
877
936
 
937
+
878
938
  // Setup storage for internal depth/stencil buffers and bind to correct framebuffer
879
939
  function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {
880
940
 
@@ -884,7 +944,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
884
944
 
885
945
  let glInternalFormat = _gl.DEPTH_COMPONENT16;
886
946
 
887
- if ( isMultisample ) {
947
+ if ( isMultisample || renderTarget.useRenderToTexture ) {
888
948
 
889
949
  const depthTexture = renderTarget.depthTexture;
890
950
 
@@ -904,7 +964,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
904
964
 
905
965
  const samples = getRenderTargetSamples( renderTarget );
906
966
 
907
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
967
+ if ( renderTarget.useRenderToTexture ) {
968
+
969
+ MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
970
+
971
+ } else {
972
+
973
+ _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
974
+
975
+ }
908
976
 
909
977
  } else {
910
978
 
@@ -916,12 +984,16 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
916
984
 
917
985
  } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
918
986
 
919
- if ( isMultisample ) {
987
+ const samples = getRenderTargetSamples( renderTarget );
920
988
 
921
- const samples = getRenderTargetSamples( renderTarget );
989
+ if ( isMultisample && renderTarget.useRenderbuffer ) {
922
990
 
923
991
  _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
924
992
 
993
+ } else if ( renderTarget.useRenderToTexture ) {
994
+
995
+ MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
996
+
925
997
  } else {
926
998
 
927
999
  _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
@@ -939,13 +1011,16 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
939
1011
  const glFormat = utils.convert( texture.format );
940
1012
  const glType = utils.convert( texture.type );
941
1013
  const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
1014
+ const samples = getRenderTargetSamples( renderTarget );
942
1015
 
943
- if ( isMultisample ) {
944
-
945
- const samples = getRenderTargetSamples( renderTarget );
1016
+ if ( isMultisample && renderTarget.useRenderbuffer ) {
946
1017
 
947
1018
  _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
948
1019
 
1020
+ } else if ( renderTarget.useRenderToTexture ) {
1021
+
1022
+ MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1023
+
949
1024
  } else {
950
1025
 
951
1026
  _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
@@ -986,14 +1061,31 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
986
1061
  setTexture2D( renderTarget.depthTexture, 0 );
987
1062
 
988
1063
  const webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;
1064
+ const samples = getRenderTargetSamples( renderTarget );
989
1065
 
990
1066
  if ( renderTarget.depthTexture.format === DepthFormat ) {
991
1067
 
992
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1068
+ if ( renderTarget.useRenderToTexture ) {
1069
+
1070
+ MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1071
+
1072
+ } else {
1073
+
1074
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1075
+
1076
+ }
993
1077
 
994
1078
  } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
995
1079
 
996
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1080
+ if ( renderTarget.useRenderToTexture ) {
1081
+
1082
+ MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1083
+
1084
+ } else {
1085
+
1086
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1087
+
1088
+ }
997
1089
 
998
1090
  } else {
999
1091
 
@@ -1007,10 +1099,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1007
1099
  function setupDepthRenderbuffer( renderTarget ) {
1008
1100
 
1009
1101
  const renderTargetProperties = properties.get( renderTarget );
1010
-
1011
1102
  const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
1012
1103
 
1013
- if ( renderTarget.depthTexture ) {
1104
+ if ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {
1014
1105
 
1015
1106
  if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );
1016
1107
 
@@ -1044,6 +1135,25 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1044
1135
 
1045
1136
  }
1046
1137
 
1138
+ // rebind framebuffer with external textures
1139
+ function rebindTextures( renderTarget, colorTexture, depthTexture ) {
1140
+
1141
+ const renderTargetProperties = properties.get( renderTarget );
1142
+
1143
+ if ( colorTexture !== undefined ) {
1144
+
1145
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
1146
+
1147
+ }
1148
+
1149
+ if ( depthTexture !== undefined ) {
1150
+
1151
+ setupDepthRenderbuffer( renderTarget );
1152
+
1153
+ }
1154
+
1155
+ }
1156
+
1047
1157
  // Set up GL resources for the render target
1048
1158
  function setupRenderTarget( renderTarget ) {
1049
1159
 
@@ -1056,7 +1166,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1056
1166
 
1057
1167
  if ( renderTarget.isWebGLMultipleRenderTargets !== true ) {
1058
1168
 
1059
- textureProperties.__webglTexture = _gl.createTexture();
1169
+ if ( textureProperties.__webglTexture === undefined ) {
1170
+
1171
+ textureProperties.__webglTexture = _gl.createTexture();
1172
+
1173
+ }
1174
+
1060
1175
  textureProperties.__version = texture.version;
1061
1176
  info.memory.textures ++;
1062
1177
 
@@ -1064,7 +1179,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1064
1179
 
1065
1180
  const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
1066
1181
  const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
1067
- const isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true );
1068
1182
  const isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray;
1069
1183
  const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
1070
1184
 
@@ -1120,7 +1234,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1120
1234
 
1121
1235
  }
1122
1236
 
1123
- } else if ( isMultisample ) {
1237
+ } else if ( renderTarget.useRenderbuffer ) {
1124
1238
 
1125
1239
  if ( isWebGL2 ) {
1126
1240
 
@@ -1174,7 +1288,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1174
1288
 
1175
1289
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1176
1290
 
1177
- generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, renderTarget.width, renderTarget.height );
1291
+ generateMipmap( _gl.TEXTURE_CUBE_MAP );
1178
1292
 
1179
1293
  }
1180
1294
 
@@ -1195,7 +1309,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1195
1309
 
1196
1310
  if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {
1197
1311
 
1198
- generateMipmap( _gl.TEXTURE_2D, attachment, renderTarget.width, renderTarget.height );
1312
+ generateMipmap( _gl.TEXTURE_2D );
1199
1313
 
1200
1314
  }
1201
1315
 
@@ -1230,7 +1344,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1230
1344
 
1231
1345
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1232
1346
 
1233
- generateMipmap( glTextureType, texture, renderTarget.width, renderTarget.height, renderTarget.depth );
1347
+ generateMipmap( glTextureType );
1234
1348
 
1235
1349
  }
1236
1350
 
@@ -1264,7 +1378,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1264
1378
  const webglTexture = properties.get( texture ).__webglTexture;
1265
1379
 
1266
1380
  state.bindTexture( target, webglTexture );
1267
- generateMipmap( target, texture, renderTarget.width, renderTarget.height );
1381
+ generateMipmap( target );
1268
1382
  state.unbindTexture();
1269
1383
 
1270
1384
  }
@@ -1275,23 +1389,43 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1275
1389
 
1276
1390
  function updateMultisampleRenderTarget( renderTarget ) {
1277
1391
 
1278
- if ( renderTarget.isWebGLMultisampleRenderTarget ) {
1392
+ if ( renderTarget.useRenderbuffer ) {
1279
1393
 
1280
1394
  if ( isWebGL2 ) {
1281
1395
 
1282
1396
  const width = renderTarget.width;
1283
1397
  const height = renderTarget.height;
1284
1398
  let mask = _gl.COLOR_BUFFER_BIT;
1399
+ const invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];
1400
+ const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
1401
+
1402
+ if ( renderTarget.depthBuffer ) {
1403
+
1404
+ invalidationArray.push( depthStyle );
1405
+
1406
+ }
1285
1407
 
1286
- if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
1287
- if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
1408
+ if ( ! renderTarget.ignoreDepthForMultisampleCopy ) {
1409
+
1410
+ if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
1411
+ if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
1412
+
1413
+ }
1288
1414
 
1289
1415
  const renderTargetProperties = properties.get( renderTarget );
1290
1416
 
1291
1417
  state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1292
1418
  state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
1293
1419
 
1420
+ if ( renderTarget.ignoreDepthForMultisampleCopy ) {
1421
+
1422
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
1423
+ _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
1424
+
1425
+ }
1426
+
1294
1427
  _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
1428
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
1295
1429
 
1296
1430
  state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
1297
1431
  state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
@@ -1308,7 +1442,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1308
1442
 
1309
1443
  function getRenderTargetSamples( renderTarget ) {
1310
1444
 
1311
- return ( isWebGL2 && renderTarget.isWebGLMultisampleRenderTarget ) ?
1445
+ return ( isWebGL2 && ( renderTarget.useRenderbuffer || renderTarget.useRenderToTexture ) ) ?
1312
1446
  Math.min( maxSamples, renderTarget.samples ) : 0;
1313
1447
 
1314
1448
  }
@@ -1381,9 +1515,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1381
1515
  this.setTexture2DArray = setTexture2DArray;
1382
1516
  this.setTexture3D = setTexture3D;
1383
1517
  this.setTextureCube = setTextureCube;
1518
+ this.rebindTextures = rebindTextures;
1384
1519
  this.setupRenderTarget = setupRenderTarget;
1385
1520
  this.updateRenderTargetMipmap = updateRenderTargetMipmap;
1386
1521
  this.updateMultisampleRenderTarget = updateMultisampleRenderTarget;
1522
+ this.setupDepthRenderbuffer = setupDepthRenderbuffer;
1523
+ this.setupFrameBufferTexture = setupFrameBufferTexture;
1387
1524
 
1388
1525
  this.safeSetTexture2D = safeSetTexture2D;
1389
1526
  this.safeSetTextureCube = safeSetTextureCube;
@@ -690,7 +690,7 @@ function setValueV4uiArray( gl, v ) {
690
690
  }
691
691
 
692
692
 
693
- // Array of textures (2D / Cube)
693
+ // Array of textures (2D / 3D / Cube / 2DArray)
694
694
 
695
695
  function setValueT1Array( gl, v, textures ) {
696
696
 
@@ -708,6 +708,22 @@ function setValueT1Array( gl, v, textures ) {
708
708
 
709
709
  }
710
710
 
711
+ function setValueT3DArray( gl, v, textures ) {
712
+
713
+ const n = v.length;
714
+
715
+ const units = allocTexUnits( textures, n );
716
+
717
+ gl.uniform1iv( this.addr, units );
718
+
719
+ for ( let i = 0; i !== n; ++ i ) {
720
+
721
+ textures.setTexture3D( v[ i ] || emptyTexture3d, units[ i ] );
722
+
723
+ }
724
+
725
+ }
726
+
711
727
  function setValueT6Array( gl, v, textures ) {
712
728
 
713
729
  const n = v.length;
@@ -724,6 +740,23 @@ function setValueT6Array( gl, v, textures ) {
724
740
 
725
741
  }
726
742
 
743
+ function setValueT2DArrayArray( gl, v, textures ) {
744
+
745
+ const n = v.length;
746
+
747
+ const units = allocTexUnits( textures, n );
748
+
749
+ gl.uniform1iv( this.addr, units );
750
+
751
+ for ( let i = 0; i !== n; ++ i ) {
752
+
753
+ textures.setTexture2DArray( v[ i ] || emptyTexture2dArray, units[ i ] );
754
+
755
+ }
756
+
757
+ }
758
+
759
+
727
760
  // Helper to pick the right setter for a pure (bottom-level) array
728
761
 
729
762
  function getPureArraySetter( type ) {
@@ -756,12 +789,23 @@ function getPureArraySetter( type ) {
756
789
  case 0x8b62: // SAMPLER_2D_SHADOW
757
790
  return setValueT1Array;
758
791
 
792
+ case 0x8b5f: // SAMPLER_3D
793
+ case 0x8dcb: // INT_SAMPLER_3D
794
+ case 0x8dd3: // UNSIGNED_INT_SAMPLER_3D
795
+ return setValueT3DArray;
796
+
759
797
  case 0x8b60: // SAMPLER_CUBE
760
798
  case 0x8dcc: // INT_SAMPLER_CUBE
761
799
  case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE
762
800
  case 0x8dc5: // SAMPLER_CUBE_SHADOW
763
801
  return setValueT6Array;
764
802
 
803
+ case 0x8dc1: // SAMPLER_2D_ARRAY
804
+ case 0x8dcf: // INT_SAMPLER_2D_ARRAY
805
+ case 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY
806
+ case 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW
807
+ return setValueT2DArrayArray;
808
+
765
809
  }
766
810
 
767
811
  }