super-three 0.163.0 → 0.165.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +1127 -452
  3. package/build/three.module.js +1127 -452
  4. package/build/three.module.min.js +2 -2
  5. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  6. package/examples/jsm/controls/TransformControls.js +1 -1
  7. package/examples/jsm/environments/RoomEnvironment.js +1 -5
  8. package/examples/jsm/exporters/GLTFExporter.js +45 -1
  9. package/examples/jsm/exporters/USDZExporter.js +13 -5
  10. package/examples/jsm/helpers/ViewHelper.js +32 -67
  11. package/examples/jsm/libs/draco/README.md +2 -2
  12. package/examples/jsm/libs/tween.module.js +75 -64
  13. package/examples/jsm/lines/LineMaterial.js +1 -15
  14. package/examples/jsm/lines/LineSegments2.js +15 -0
  15. package/examples/jsm/lines/Wireframe.js +16 -1
  16. package/examples/jsm/loaders/DRACOLoader.js +1 -1
  17. package/examples/jsm/loaders/EXRLoader.js +283 -99
  18. package/examples/jsm/loaders/FBXLoader.js +24 -13
  19. package/examples/jsm/loaders/GLTFLoader.js +55 -0
  20. package/examples/jsm/loaders/KTX2Loader.js +3 -6
  21. package/examples/jsm/loaders/LDrawLoader.js +3 -2
  22. package/examples/jsm/loaders/MMDLoader.js +31 -12
  23. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  24. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  25. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  26. package/examples/jsm/math/Octree.js +26 -20
  27. package/examples/jsm/modifiers/CurveModifier.js +11 -9
  28. package/examples/jsm/nodes/Nodes.js +15 -13
  29. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  30. package/examples/jsm/nodes/accessors/BitangentNode.js +7 -83
  31. package/examples/jsm/nodes/accessors/BufferNode.js +6 -0
  32. package/examples/jsm/nodes/accessors/CameraNode.js +12 -119
  33. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  34. package/examples/jsm/nodes/accessors/MaterialNode.js +109 -3
  35. package/examples/jsm/nodes/accessors/ModelNode.js +3 -0
  36. package/examples/jsm/nodes/accessors/NormalNode.js +9 -101
  37. package/examples/jsm/nodes/accessors/PositionNode.js +6 -100
  38. package/examples/jsm/nodes/accessors/ReferenceNode.js +6 -0
  39. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -31
  40. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  41. package/examples/jsm/nodes/accessors/{TextureStoreNode.js → StorageTextureNode.js} +19 -6
  42. package/examples/jsm/nodes/accessors/TangentNode.js +11 -97
  43. package/examples/jsm/nodes/accessors/Texture3DNode.js +100 -0
  44. package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
  45. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  46. package/examples/jsm/nodes/accessors/UVNode.js +2 -46
  47. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  48. package/examples/jsm/nodes/core/AttributeNode.js +15 -3
  49. package/examples/jsm/nodes/core/ContextNode.js +6 -0
  50. package/examples/jsm/nodes/core/Node.js +23 -2
  51. package/examples/jsm/nodes/core/NodeBuilder.js +25 -18
  52. package/examples/jsm/nodes/core/NodeKeywords.js +1 -1
  53. package/examples/jsm/nodes/core/OutputStructNode.js +3 -6
  54. package/examples/jsm/nodes/core/PropertyNode.js +11 -0
  55. package/examples/jsm/nodes/core/VaryingNode.js +40 -9
  56. package/examples/jsm/nodes/display/AfterImageNode.js +14 -2
  57. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  58. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  59. package/examples/jsm/nodes/display/PassNode.js +3 -1
  60. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  61. package/examples/jsm/nodes/display/ViewportNode.js +5 -3
  62. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  63. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  64. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  65. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  66. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  67. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  68. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +210 -12
  69. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  70. package/examples/jsm/nodes/functions/ToonLightingModel.js +49 -0
  71. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +20 -5
  72. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/EnvironmentNode.js +11 -2
  74. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  75. package/examples/jsm/nodes/lighting/LightsNode.js +28 -1
  76. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  77. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  78. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +11 -7
  79. package/examples/jsm/nodes/materials/Materials.js +4 -0
  80. package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +52 -0
  81. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  82. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  83. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +94 -6
  84. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  85. package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +34 -0
  86. package/examples/jsm/nodes/materials/NodeMaterial.js +43 -45
  87. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  88. package/examples/jsm/nodes/materials/VolumeNodeMaterial.js +106 -0
  89. package/examples/jsm/nodes/math/HashNode.js +2 -2
  90. package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
  91. package/examples/jsm/nodes/shadernode/ShaderNode.js +57 -41
  92. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  93. package/examples/jsm/nodes/utils/MatcapUVNode.js +1 -1
  94. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  95. package/examples/jsm/objects/Lensflare.js +2 -2
  96. package/examples/jsm/physics/JoltPhysics.js +281 -0
  97. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  98. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  99. package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
  100. package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
  101. package/examples/jsm/renderers/common/Attributes.js +2 -0
  102. package/examples/jsm/renderers/common/Background.js +3 -3
  103. package/examples/jsm/renderers/common/Bindings.js +17 -0
  104. package/examples/jsm/renderers/common/ChainMap.js +18 -48
  105. package/examples/jsm/renderers/common/ClippingContext.js +5 -5
  106. package/examples/jsm/renderers/common/Pipelines.js +2 -2
  107. package/examples/jsm/renderers/common/RenderBundle.js +18 -0
  108. package/examples/jsm/renderers/common/RenderBundles.js +38 -0
  109. package/examples/jsm/renderers/common/RenderList.js +10 -1
  110. package/examples/jsm/renderers/common/RenderObject.js +49 -1
  111. package/examples/jsm/renderers/common/Renderer.js +268 -25
  112. package/examples/jsm/renderers/common/Textures.js +1 -1
  113. package/examples/jsm/renderers/common/Uniform.js +1 -1
  114. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
  115. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +18 -4
  116. package/examples/jsm/renderers/common/nodes/NodeSampler.js +6 -0
  117. package/examples/jsm/renderers/common/nodes/Nodes.js +31 -47
  118. package/examples/jsm/renderers/webgl/WebGLBackend.js +7 -21
  119. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +5 -1
  120. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +23 -5
  121. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +114 -13
  122. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
  123. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +80 -46
  124. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +85 -12
  125. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +10 -1
  127. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +6 -0
  128. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +62 -19
  129. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -3
  130. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  131. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  132. package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
  133. package/examples/jsm/utils/GPUStatsPanel.js +2 -0
  134. package/examples/jsm/utils/SceneUtils.js +60 -1
  135. package/examples/jsm/utils/SortUtils.js +8 -5
  136. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  137. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  138. package/package.json +3 -2
  139. package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
  140. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
  141. package/src/animation/tracks/StringKeyframeTrack.js +10 -1
  142. package/src/constants.js +1 -1
  143. package/src/core/Object3D.js +2 -0
  144. package/src/core/Raycaster.js +6 -2
  145. package/src/core/RenderTarget.js +8 -0
  146. package/src/extras/PMREMGenerator.js +12 -11
  147. package/src/loaders/FileLoader.js +5 -1
  148. package/src/loaders/LoaderUtils.js +3 -1
  149. package/src/loaders/MaterialLoader.js +1 -0
  150. package/src/loaders/ObjectLoader.js +1 -0
  151. package/src/materials/Material.js +2 -0
  152. package/src/materials/MeshPhysicalMaterial.js +20 -0
  153. package/src/objects/BatchedMesh.js +114 -1
  154. package/src/objects/Line.js +66 -43
  155. package/src/renderers/WebGLRenderer.js +371 -109
  156. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +15 -0
  157. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
  158. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
  159. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
  160. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  161. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  162. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
  163. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
  164. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
  165. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
  166. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
  167. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  168. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  169. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  170. package/src/renderers/shaders/ShaderChunk.js +0 -2
  171. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  172. package/src/renderers/shaders/ShaderLib.js +1 -0
  173. package/src/renderers/webgl/WebGLBackground.js +24 -3
  174. package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
  175. package/src/renderers/webgl/WebGLCapabilities.js +33 -1
  176. package/src/renderers/webgl/WebGLExtensions.js +3 -1
  177. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
  178. package/src/renderers/webgl/WebGLLights.js +9 -12
  179. package/src/renderers/webgl/WebGLMaterials.js +7 -5
  180. package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
  181. package/src/renderers/webgl/WebGLProgram.js +5 -36
  182. package/src/renderers/webgl/WebGLPrograms.js +19 -14
  183. package/src/renderers/webgl/WebGLRenderStates.js +8 -4
  184. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  185. package/src/renderers/webgl/WebGLTextures.js +206 -129
  186. package/src/renderers/webgl/WebGLUtils.js +3 -21
  187. package/src/renderers/webxr/WebXRDepthSensing.js +3 -3
  188. package/src/renderers/webxr/WebXRManager.js +8 -6
  189. package/src/textures/CompressedArrayTexture.js +14 -0
  190. package/src/textures/DataArrayTexture.js +14 -0
  191. package/src/textures/DepthTexture.js +1 -3
  192. package/src/utils.js +30 -1
  193. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -318
  194. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  195. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -792
  196. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  197. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -1,4 +1,4 @@
1
- import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, RGB_ETC1_Format, DepthFormat, DepthStencilFormat, UnsignedIntType, UnsignedInt248Type, FloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, UnsignedByteType, NoColorSpace, LinearSRGBColorSpace, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, SRGBTransfer, LinearTransfer } from '../../constants.js';
1
+ import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedIntType, FloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, UnsignedByteType, NoColorSpace, LinearSRGBColorSpace, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, SRGBTransfer, LinearTransfer, UnsignedShortType, UnsignedInt248Type } from '../../constants.js';
2
2
  import { createElementNS } from '../../utils.js';
3
3
  import { ColorManagement } from '../../math/ColorManagement.js';
4
4
  import { Vector2 } from '../../math/Vector2.js';
@@ -200,6 +200,48 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
200
200
 
201
201
  }
202
202
 
203
+ function getInternalDepthFormat( useStencil, depthType ) {
204
+
205
+ let glInternalFormat;
206
+ if ( useStencil ) {
207
+
208
+ if ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {
209
+
210
+ glInternalFormat = _gl.DEPTH24_STENCIL8;
211
+
212
+ } else if ( depthType === FloatType ) {
213
+
214
+ glInternalFormat = _gl.DEPTH32F_STENCIL8;
215
+
216
+ } else if ( depthType === UnsignedShortType ) {
217
+
218
+ glInternalFormat = _gl.DEPTH24_STENCIL8;
219
+ console.warn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );
220
+
221
+ }
222
+
223
+ } else {
224
+
225
+ if ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {
226
+
227
+ glInternalFormat = _gl.DEPTH_COMPONENT24;
228
+
229
+ } else if ( depthType === FloatType ) {
230
+
231
+ glInternalFormat = _gl.DEPTH_COMPONENT32F;
232
+
233
+ } else if ( depthType === UnsignedShortType ) {
234
+
235
+ glInternalFormat = _gl.DEPTH_COMPONENT16;
236
+
237
+ }
238
+
239
+ }
240
+
241
+ return glInternalFormat;
242
+
243
+ }
244
+
203
245
  function getMipLevels( texture, image ) {
204
246
 
205
247
  if ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {
@@ -747,30 +789,14 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
747
789
  let mipmap;
748
790
  const mipmaps = texture.mipmaps;
749
791
 
750
- const useTexStorage = ( texture.isVideoTexture !== true && glInternalFormat !== RGB_ETC1_Format );
792
+ const useTexStorage = ( texture.isVideoTexture !== true );
751
793
  const allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );
752
794
  const dataReady = source.dataReady;
753
795
  const levels = getMipLevels( texture, image );
754
796
 
755
797
  if ( texture.isDepthTexture ) {
756
798
 
757
- // populate depth texture with dummy data
758
-
759
- glInternalFormat = _gl.DEPTH_COMPONENT16;
760
-
761
- if ( texture.type === FloatType ) {
762
-
763
- glInternalFormat = _gl.DEPTH_COMPONENT32F;
764
-
765
- } else if ( texture.type === UnsignedIntType ) {
766
-
767
- glInternalFormat = _gl.DEPTH_COMPONENT24;
768
-
769
- } else if ( texture.type === UnsignedInt248Type ) {
770
-
771
- glInternalFormat = _gl.DEPTH24_STENCIL8;
772
-
773
- }
799
+ glInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );
774
800
 
775
801
  //
776
802
 
@@ -870,7 +896,22 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
870
896
 
871
897
  if ( dataReady ) {
872
898
 
873
- state.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data, 0, 0 );
899
+ if ( texture.layerUpdates.size > 0 ) {
900
+
901
+ for ( const layerIndex of texture.layerUpdates ) {
902
+
903
+ const layerSize = mipmap.width * mipmap.height;
904
+ state.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, mipmap.data.slice( layerSize * layerIndex, layerSize * ( layerIndex + 1 ) ), 0, 0 );
905
+
906
+ }
907
+
908
+ texture.clearLayerUpdates();
909
+
910
+ } else {
911
+
912
+ state.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data, 0, 0 );
913
+
914
+ }
874
915
 
875
916
  }
876
917
 
@@ -976,7 +1017,72 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
976
1017
 
977
1018
  if ( dataReady ) {
978
1019
 
979
- state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
1020
+ if ( texture.layerUpdates.size > 0 ) {
1021
+
1022
+ // When type is GL_UNSIGNED_BYTE, each of these bytes is
1023
+ // interpreted as one color component, depending on format. When
1024
+ // type is one of GL_UNSIGNED_SHORT_5_6_5,
1025
+ // GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_5_5_5_1, each
1026
+ // unsigned value is interpreted as containing all the components
1027
+ // for a single pixel, with the color components arranged
1028
+ // according to format.
1029
+ //
1030
+ // See https://registry.khronos.org/OpenGL-Refpages/es1.1/xhtml/glTexImage2D.xml
1031
+ let texelSize;
1032
+ switch ( glType ) {
1033
+
1034
+ case _gl.UNSIGNED_BYTE:
1035
+ switch ( glFormat ) {
1036
+
1037
+ case _gl.ALPHA:
1038
+ texelSize = 1;
1039
+ break;
1040
+ case _gl.LUMINANCE:
1041
+ texelSize = 1;
1042
+ break;
1043
+ case _gl.LUMINANCE_ALPHA:
1044
+ texelSize = 2;
1045
+ break;
1046
+ case _gl.RGB:
1047
+ texelSize = 3;
1048
+ break;
1049
+ case _gl.RGBA:
1050
+ texelSize = 4;
1051
+ break;
1052
+
1053
+ default:
1054
+ throw new Error( `Unknown texel size for format ${glFormat}.` );
1055
+
1056
+ }
1057
+
1058
+ break;
1059
+
1060
+ case _gl.UNSIGNED_SHORT_4_4_4_4:
1061
+ case _gl.UNSIGNED_SHORT_5_5_5_1:
1062
+ case _gl.UNSIGNED_SHORT_5_6_5:
1063
+ texelSize = 1;
1064
+ break;
1065
+
1066
+ default:
1067
+ throw new Error( `Unknown texel size for type ${glType}.` );
1068
+
1069
+ }
1070
+
1071
+ const layerSize = image.width * image.height * texelSize;
1072
+
1073
+ for ( const layerIndex of texture.layerUpdates ) {
1074
+
1075
+ state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, image.data.slice( layerSize * layerIndex, layerSize * ( layerIndex + 1 ) ) );
1076
+
1077
+ }
1078
+
1079
+ texture.clearLayerUpdates();
1080
+
1081
+ } else {
1082
+
1083
+ state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
1084
+
1085
+ }
980
1086
 
981
1087
  }
982
1088
 
@@ -1420,7 +1526,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1420
1526
 
1421
1527
  }
1422
1528
 
1423
-
1424
1529
  // Setup storage for internal depth/stencil buffers and bind to correct framebuffer
1425
1530
  function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {
1426
1531
 
@@ -1480,66 +1585,30 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1480
1585
 
1481
1586
  } else if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
1482
1587
 
1483
- let glInternalFormat = _gl.DEPTH_COMPONENT24;
1484
-
1485
- if ( isMultisample || useMultisampledRTT( renderTarget ) ) {
1486
-
1487
- const depthTexture = renderTarget.depthTexture;
1488
-
1489
- if ( depthTexture && depthTexture.isDepthTexture ) {
1490
-
1491
- if ( depthTexture.type === FloatType ) {
1492
-
1493
- glInternalFormat = _gl.DEPTH_COMPONENT32F;
1494
-
1495
- } else if ( depthTexture.type === UnsignedIntType ) {
1496
-
1497
- glInternalFormat = _gl.DEPTH_COMPONENT24;
1498
-
1499
- }
1500
-
1501
- }
1502
-
1503
- const samples = getRenderTargetSamples( renderTarget );
1504
-
1505
- if ( useMultisampledRTT( renderTarget ) ) {
1506
-
1507
- multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1508
-
1509
- } else {
1510
-
1511
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1512
-
1513
- }
1514
-
1515
- } else {
1516
-
1517
- _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
1518
-
1519
- }
1520
-
1521
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
1522
-
1523
- } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
1588
+ // retrieve the depth attachment types
1589
+ const depthTexture = renderTarget.depthTexture;
1590
+ const depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;
1591
+ const glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );
1592
+ const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
1524
1593
 
1594
+ // set up the attachment
1525
1595
  const samples = getRenderTargetSamples( renderTarget );
1596
+ const isUseMultisampledRTT = useMultisampledRTT( renderTarget );
1597
+ if ( isUseMultisampledRTT ) {
1526
1598
 
1527
- if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {
1528
-
1529
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
1599
+ multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1530
1600
 
1531
- } else if ( useMultisampledRTT( renderTarget ) ) {
1601
+ } else if ( isMultisample ) {
1532
1602
 
1533
- multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
1603
+ _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1534
1604
 
1535
1605
  } else {
1536
1606
 
1537
- _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
1607
+ _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
1538
1608
 
1539
1609
  }
1540
1610
 
1541
-
1542
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
1611
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );
1543
1612
 
1544
1613
  } else {
1545
1614
 
@@ -2004,112 +2073,120 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
2004
2073
 
2005
2074
  }
2006
2075
 
2076
+ const invalidationArrayRead = [];
2077
+ const invalidationArrayDraw = [];
2078
+
2007
2079
  function updateMultisampleRenderTarget( renderTarget ) {
2008
2080
 
2009
- if ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
2081
+ if ( renderTarget.samples > 0 ) {
2010
2082
 
2011
- const textures = renderTarget.textures;
2012
- const width = renderTarget.width;
2013
- const height = renderTarget.height;
2014
- let mask = _gl.COLOR_BUFFER_BIT;
2015
- const invalidationArray = [];
2016
- const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
2017
- const renderTargetProperties = properties.get( renderTarget );
2018
- const isMultipleRenderTargets = ( textures.length > 1 );
2019
-
2020
- // If MRT we need to remove FBO attachments
2021
- if ( isMultipleRenderTargets ) {
2083
+ if ( useMultisampledRTT( renderTarget ) === false ) {
2022
2084
 
2023
- for ( let i = 0; i < textures.length; i ++ ) {
2085
+ const textures = renderTarget.textures;
2086
+ const width = renderTarget.width;
2087
+ const height = renderTarget.height;
2088
+ let mask = _gl.COLOR_BUFFER_BIT;
2089
+ const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
2090
+ const renderTargetProperties = properties.get( renderTarget );
2091
+ const isMultipleRenderTargets = ( textures.length > 1 );
2092
+
2093
+ // If MRT we need to remove FBO attachments
2094
+ if ( isMultipleRenderTargets ) {
2095
+
2096
+ for ( let i = 0; i < textures.length; i ++ ) {
2024
2097
 
2025
- state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
2026
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );
2098
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
2099
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );
2027
2100
 
2028
- state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
2029
- _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );
2101
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
2102
+ _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );
2103
+
2104
+ }
2030
2105
 
2031
2106
  }
2032
2107
 
2033
- }
2108
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
2109
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
2034
2110
 
2035
- state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
2036
- state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
2111
+ for ( let i = 0; i < textures.length; i ++ ) {
2037
2112
 
2038
- for ( let i = 0; i < textures.length; i ++ ) {
2113
+ if ( renderTarget.resolveDepthBuffer ) {
2039
2114
 
2040
- invalidationArray.push( _gl.COLOR_ATTACHMENT0 + i );
2115
+ if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
2041
2116
 
2042
- if ( renderTarget.depthBuffer ) {
2117
+ // resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)
2043
2118
 
2044
- invalidationArray.push( depthStyle );
2119
+ if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
2045
2120
 
2046
- }
2121
+ }
2047
2122
 
2048
- const ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;
2123
+ if ( isMultipleRenderTargets ) {
2049
2124
 
2050
- if ( ignoreDepthValues === false ) {
2125
+ _gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
2051
2126
 
2052
- if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
2127
+ const webglTexture = properties.get( textures[ i ] ).__webglTexture;
2128
+ _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );
2053
2129
 
2054
- // resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)
2130
+ }
2055
2131
 
2056
- if ( renderTarget.stencilBuffer && renderTargetProperties.__isTransmissionRenderTarget !== true ) mask |= _gl.STENCIL_BUFFER_BIT;
2132
+ _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
2057
2133
 
2058
- }
2134
+ if ( supportsInvalidateFramebuffer === true ) {
2059
2135
 
2060
- if ( isMultipleRenderTargets ) {
2136
+ invalidationArrayRead.length = 0;
2137
+ invalidationArrayDraw.length = 0;
2061
2138
 
2062
- _gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
2139
+ invalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );
2063
2140
 
2064
- }
2141
+ if ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {
2065
2142
 
2066
- if ( ignoreDepthValues === true ) {
2143
+ invalidationArrayRead.push( depthStyle );
2144
+ invalidationArrayDraw.push( depthStyle );
2067
2145
 
2068
- _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
2069
- _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
2146
+ _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );
2070
2147
 
2071
- }
2148
+ }
2072
2149
 
2073
- if ( isMultipleRenderTargets ) {
2150
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );
2074
2151
 
2075
- const webglTexture = properties.get( textures[ i ] ).__webglTexture;
2076
- _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );
2152
+ }
2077
2153
 
2078
2154
  }
2079
2155
 
2080
- _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
2156
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
2157
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );
2081
2158
 
2082
- if ( supportsInvalidateFramebuffer ) {
2159
+ // If MRT since pre-blit we removed the FBO we need to reconstruct the attachments
2160
+ if ( isMultipleRenderTargets ) {
2083
2161
 
2084
- _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
2162
+ for ( let i = 0; i < textures.length; i ++ ) {
2085
2163
 
2086
- }
2164
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
2165
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
2087
2166
 
2167
+ const webglTexture = properties.get( textures[ i ] ).__webglTexture;
2088
2168
 
2089
- }
2169
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
2170
+ _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );
2090
2171
 
2091
- state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
2092
- state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );
2172
+ }
2093
2173
 
2094
- // If MRT since pre-blit we removed the FBO we need to reconstruct the attachments
2095
- if ( isMultipleRenderTargets ) {
2174
+ }
2096
2175
 
2097
- for ( let i = 0; i < textures.length; i ++ ) {
2176
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
2098
2177
 
2099
- state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
2100
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
2178
+ } else {
2179
+
2180
+ if ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {
2101
2181
 
2102
- const webglTexture = properties.get( textures[ i ] ).__webglTexture;
2182
+ const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
2103
2183
 
2104
- state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
2105
- _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );
2184
+ _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
2106
2185
 
2107
2186
  }
2108
2187
 
2109
2188
  }
2110
2189
 
2111
- state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
2112
-
2113
2190
  }
2114
2191
 
2115
2192
  }
@@ -101,33 +101,15 @@ function WebGLUtils( gl, extensions ) {
101
101
 
102
102
  }
103
103
 
104
- // ETC1
104
+ // ETC
105
105
 
106
- if ( p === RGB_ETC1_Format ) {
107
-
108
- extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
109
-
110
- if ( extension !== null ) {
111
-
112
- return extension.COMPRESSED_RGB_ETC1_WEBGL;
113
-
114
- } else {
115
-
116
- return null;
117
-
118
- }
119
-
120
- }
121
-
122
- // ETC2
123
-
124
- if ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {
106
+ if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {
125
107
 
126
108
  extension = extensions.get( 'WEBGL_compressed_texture_etc' );
127
109
 
128
110
  if ( extension !== null ) {
129
111
 
130
- if ( p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;
112
+ if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;
131
113
  if ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;
132
114
 
133
115
  } else {
@@ -65,7 +65,7 @@ class WebXRDepthSensing {
65
65
 
66
66
  }
67
67
 
68
- render( renderer, cameraXR ) {
68
+ getMesh( cameraXR ) {
69
69
 
70
70
  if ( this.texture !== null ) {
71
71
 
@@ -86,10 +86,10 @@ class WebXRDepthSensing {
86
86
 
87
87
  }
88
88
 
89
- renderer.render( this.mesh, cameraXR );
90
-
91
89
  }
92
90
 
91
+ return this.mesh;
92
+
93
93
  }
94
94
 
95
95
  reset() {
@@ -361,7 +361,8 @@ class WebXRManager extends EventDispatcher {
361
361
  depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),
362
362
  stencilBuffer: attributes.stencil,
363
363
  colorSpace: renderer.outputColorSpace,
364
- samples: attributes.antialias ? 4 : 0
364
+ samples: attributes.antialias ? 4 : 0,
365
+ resolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false )
365
366
  };
366
367
 
367
368
  if ( scope.isMultiview ) {
@@ -381,9 +382,6 @@ class WebXRManager extends EventDispatcher {
381
382
 
382
383
  }
383
384
 
384
- const renderTargetProperties = renderer.properties.get( newRenderTarget );
385
- renderTargetProperties.__ignoreDepthValues = glProjLayer.ignoreDepthValues;
386
-
387
385
  }
388
386
 
389
387
  newRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278
@@ -727,6 +725,12 @@ class WebXRManager extends EventDispatcher {
727
725
 
728
726
  };
729
727
 
728
+ this.getDepthSensingMesh = function () {
729
+
730
+ return depthSensing.getMesh( cameraXR );
731
+
732
+ };
733
+
730
734
  // Animation Loop
731
735
 
732
736
  let onAnimationFrameCallback = null;
@@ -852,8 +856,6 @@ class WebXRManager extends EventDispatcher {
852
856
 
853
857
  }
854
858
 
855
- depthSensing.render( renderer, cameraXR );
856
-
857
859
  if ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );
858
860
 
859
861
  if ( frame.detectedPlanes ) {
@@ -11,6 +11,20 @@ class CompressedArrayTexture extends CompressedTexture {
11
11
  this.image.depth = depth;
12
12
  this.wrapR = ClampToEdgeWrapping;
13
13
 
14
+ this.layerUpdates = new Set();
15
+
16
+ }
17
+
18
+ addLayerUpdates( layerIndex ) {
19
+
20
+ this.layerUpdates.add( layerIndex );
21
+
22
+ }
23
+
24
+ clearLayerUpdates() {
25
+
26
+ this.layerUpdates.clear();
27
+
14
28
  }
15
29
 
16
30
  }
@@ -20,6 +20,20 @@ class DataArrayTexture extends Texture {
20
20
  this.flipY = false;
21
21
  this.unpackAlignment = 1;
22
22
 
23
+ this.layerUpdates = new Set();
24
+
25
+ }
26
+
27
+ addLayerUpdate( layerIndex ) {
28
+
29
+ this.layerUpdates.add( layerIndex );
30
+
31
+ }
32
+
33
+ clearLayerUpdates() {
34
+
35
+ this.layerUpdates.clear();
36
+
23
37
  }
24
38
 
25
39
  }
@@ -3,9 +3,7 @@ import { NearestFilter, UnsignedIntType, UnsignedInt248Type, DepthFormat, DepthS
3
3
 
4
4
  class DepthTexture extends Texture {
5
5
 
6
- constructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {
7
-
8
- format = format !== undefined ? format : DepthFormat;
6
+ constructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format = DepthFormat ) {
9
7
 
10
8
  if ( format !== DepthFormat && format !== DepthStencilFormat ) {
11
9
 
package/src/utils.js CHANGED
@@ -88,4 +88,33 @@ function warnOnce( message ) {
88
88
 
89
89
  }
90
90
 
91
- export { arrayMin, arrayMax, arrayNeedsUint32, getTypedArray, createElementNS, createCanvasElement, warnOnce };
91
+ function probeAsync( gl, sync, interval ) {
92
+
93
+ return new Promise( function ( resolve, reject ) {
94
+
95
+ function probe() {
96
+
97
+ switch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {
98
+
99
+ case gl.WAIT_FAILED:
100
+ reject();
101
+ break;
102
+
103
+ case gl.TIMEOUT_EXPIRED:
104
+ setTimeout( probe, interval );
105
+ break;
106
+
107
+ default:
108
+ resolve();
109
+
110
+ }
111
+
112
+ }
113
+
114
+ setTimeout( probe, interval );
115
+
116
+ } );
117
+
118
+ }
119
+
120
+ export { arrayMin, arrayMax, arrayNeedsUint32, getTypedArray, createElementNS, createCanvasElement, warnOnce, probeAsync };