@plastic-software/three 0.178.0 → 0.180.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 (245) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +950 -230
  3. package/build/three.core.js +754 -138
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +197 -96
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +99 -25
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +4586 -1499
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +4544 -1499
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +2 -3
  14. package/examples/jsm/capabilities/WebGPU.js +1 -1
  15. package/examples/jsm/controls/ArcballControls.js +7 -7
  16. package/examples/jsm/controls/DragControls.js +6 -56
  17. package/examples/jsm/controls/FirstPersonControls.js +2 -2
  18. package/examples/jsm/controls/PointerLockControls.js +0 -8
  19. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  20. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  21. package/examples/jsm/exporters/GLTFExporter.js +30 -22
  22. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  23. package/examples/jsm/exporters/PLYExporter.js +1 -1
  24. package/examples/jsm/exporters/USDZExporter.js +676 -299
  25. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  26. package/examples/jsm/interactive/HTMLMesh.js +5 -3
  27. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  28. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  29. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  30. package/examples/jsm/lines/Line2.js +3 -3
  31. package/examples/jsm/lines/LineGeometry.js +1 -1
  32. package/examples/jsm/lines/LineSegments2.js +2 -2
  33. package/examples/jsm/lines/Wireframe.js +2 -2
  34. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  35. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  36. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  37. package/examples/jsm/loaders/ColladaLoader.js +1 -1
  38. package/examples/jsm/loaders/EXRLoader.js +210 -22
  39. package/examples/jsm/loaders/FBXLoader.js +1 -1
  40. package/examples/jsm/loaders/GLTFLoader.js +9 -5
  41. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  42. package/examples/jsm/loaders/HDRLoader.js +486 -0
  43. package/examples/jsm/loaders/KTX2Loader.js +112 -32
  44. package/examples/jsm/loaders/MaterialXLoader.js +212 -30
  45. package/examples/jsm/loaders/RGBELoader.js +7 -473
  46. package/examples/jsm/loaders/TTFLoader.js +13 -1
  47. package/examples/jsm/loaders/USDLoader.js +219 -0
  48. package/examples/jsm/loaders/USDZLoader.js +4 -892
  49. package/examples/jsm/loaders/UltraHDRLoader.js +1 -1
  50. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  51. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  52. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  53. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  54. package/examples/jsm/math/ColorSpaces.js +19 -1
  55. package/examples/jsm/math/ConvexHull.js +2 -2
  56. package/examples/jsm/math/Lut.js +2 -2
  57. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  58. package/examples/jsm/misc/ProgressiveLightMap.js +1 -1
  59. package/examples/jsm/misc/Volume.js +1 -1
  60. package/examples/jsm/objects/LensflareMesh.js +3 -3
  61. package/examples/jsm/objects/SkyMesh.js +2 -2
  62. package/examples/jsm/physics/RapierPhysics.js +14 -5
  63. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  64. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  65. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  66. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  67. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  68. package/examples/jsm/transpiler/GLSLDecoder.js +23 -20
  69. package/examples/jsm/transpiler/TSLEncoder.js +2 -10
  70. package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
  71. package/examples/jsm/tsl/display/AnamorphicNode.js +27 -4
  72. package/examples/jsm/tsl/display/BloomNode.js +7 -6
  73. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
  74. package/examples/jsm/tsl/display/DepthOfFieldNode.js +439 -90
  75. package/examples/jsm/tsl/display/GTAONode.js +8 -0
  76. package/examples/jsm/tsl/display/GaussianBlurNode.js +51 -41
  77. package/examples/jsm/tsl/display/OutlineNode.js +2 -2
  78. package/examples/jsm/tsl/display/SSRNode.js +180 -65
  79. package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +181 -172
  80. package/examples/jsm/tsl/display/boxBlur.js +64 -0
  81. package/examples/jsm/tsl/display/hashBlur.js +15 -18
  82. package/examples/jsm/tsl/lighting/TiledLightsNode.js +1 -1
  83. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  84. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  85. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  86. package/package.json +1 -1
  87. package/src/Three.Core.js +2 -0
  88. package/src/Three.TSL.js +98 -24
  89. package/src/animation/AnimationClip.js +17 -2
  90. package/src/animation/KeyframeTrack.js +1 -1
  91. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  92. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  93. package/src/cameras/Camera.js +14 -0
  94. package/src/cameras/OrthographicCamera.js +1 -1
  95. package/src/cameras/PerspectiveCamera.js +1 -1
  96. package/src/constants.js +11 -3
  97. package/src/core/BufferGeometry.js +2 -2
  98. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  99. package/src/extras/PMREMGenerator.js +11 -0
  100. package/src/extras/TextureUtils.js +2 -1
  101. package/src/extras/lib/earcut.js +1 -1
  102. package/src/helpers/CameraHelper.js +41 -11
  103. package/src/helpers/SkeletonHelper.js +35 -6
  104. package/src/lights/LightShadow.js +21 -8
  105. package/src/lights/PointLightShadow.js +1 -1
  106. package/src/lights/webgpu/ProjectorLight.js +1 -1
  107. package/src/loaders/FileLoader.js +25 -2
  108. package/src/loaders/ImageBitmapLoader.js +23 -0
  109. package/src/loaders/Loader.js +14 -0
  110. package/src/loaders/LoadingManager.js +23 -0
  111. package/src/materials/Material.js +12 -0
  112. package/src/materials/MeshBasicMaterial.js +1 -1
  113. package/src/materials/MeshDistanceMaterial.js +1 -1
  114. package/src/materials/nodes/Line2NodeMaterial.js +0 -8
  115. package/src/materials/nodes/NodeMaterial.js +1 -1
  116. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  117. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  118. package/src/materials/nodes/manager/NodeMaterialObserver.js +87 -2
  119. package/src/math/ColorManagement.js +7 -1
  120. package/src/math/Frustum.js +19 -8
  121. package/src/math/FrustumArray.js +10 -5
  122. package/src/math/Line3.js +129 -2
  123. package/src/math/Matrix4.js +48 -27
  124. package/src/math/Spherical.js +2 -2
  125. package/src/nodes/Nodes.js +4 -0
  126. package/src/nodes/TSL.js +4 -0
  127. package/src/nodes/accessors/BufferNode.js +1 -1
  128. package/src/nodes/accessors/Camera.js +142 -16
  129. package/src/nodes/accessors/ClippingNode.js +6 -5
  130. package/src/nodes/accessors/CubeTextureNode.js +2 -2
  131. package/src/nodes/accessors/InstanceNode.js +3 -1
  132. package/src/nodes/accessors/Normal.js +11 -11
  133. package/src/nodes/accessors/Object3DNode.js +1 -1
  134. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  135. package/src/nodes/accessors/ReferenceNode.js +19 -4
  136. package/src/nodes/accessors/SceneNode.js +1 -1
  137. package/src/nodes/accessors/StorageTextureNode.js +1 -1
  138. package/src/nodes/accessors/Texture3DNode.js +13 -0
  139. package/src/nodes/accessors/TextureNode.js +83 -19
  140. package/src/nodes/code/FunctionCallNode.js +19 -0
  141. package/src/nodes/code/FunctionNode.js +23 -0
  142. package/src/nodes/core/ArrayNode.js +12 -0
  143. package/src/nodes/core/AssignNode.js +6 -2
  144. package/src/nodes/core/ContextNode.js +44 -1
  145. package/src/nodes/core/Node.js +30 -22
  146. package/src/nodes/core/NodeBuilder.js +71 -32
  147. package/src/nodes/core/NodeFrame.js +1 -1
  148. package/src/nodes/core/NodeUniform.js +1 -1
  149. package/src/nodes/core/NodeUtils.js +5 -3
  150. package/src/nodes/core/StackNode.js +71 -4
  151. package/src/nodes/core/StructNode.js +5 -5
  152. package/src/nodes/core/StructTypeNode.js +1 -0
  153. package/src/nodes/core/SubBuildNode.js +2 -2
  154. package/src/nodes/core/UniformNode.js +79 -14
  155. package/src/nodes/core/VarNode.js +83 -15
  156. package/src/nodes/display/FrontFacingNode.js +4 -8
  157. package/src/nodes/display/PassNode.js +148 -2
  158. package/src/nodes/display/ScreenNode.js +42 -13
  159. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  160. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  161. package/src/nodes/display/ViewportTextureNode.js +94 -4
  162. package/src/nodes/functions/PhysicalLightingModel.js +2 -2
  163. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  164. package/src/nodes/gpgpu/ComputeNode.js +67 -23
  165. package/src/nodes/gpgpu/SubgroupFunctionNode.js +430 -0
  166. package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
  167. package/src/nodes/lighting/LightsNode.js +1 -1
  168. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  169. package/src/nodes/lighting/ShadowFilterNode.js +1 -1
  170. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  171. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  172. package/src/nodes/math/BitcastNode.js +156 -0
  173. package/src/nodes/math/ConditionalNode.js +19 -3
  174. package/src/nodes/math/MathNode.js +72 -60
  175. package/src/nodes/math/OperatorNode.js +26 -25
  176. package/src/nodes/tsl/TSLCore.js +477 -142
  177. package/src/nodes/utils/DebugNode.js +1 -1
  178. package/src/nodes/utils/EventNode.js +83 -0
  179. package/src/nodes/utils/JoinNode.js +3 -1
  180. package/src/nodes/utils/MemberNode.js +58 -7
  181. package/src/nodes/utils/RTTNode.js +10 -1
  182. package/src/nodes/utils/ReflectorNode.js +51 -7
  183. package/src/nodes/utils/SampleNode.js +12 -2
  184. package/src/nodes/utils/SplitNode.js +11 -0
  185. package/src/nodes/utils/Timer.js +0 -47
  186. package/src/objects/BatchedMesh.js +6 -4
  187. package/src/objects/LOD.js +1 -1
  188. package/src/objects/Sprite.js +2 -2
  189. package/src/renderers/WebGLRenderer.js +21 -31
  190. package/src/renderers/common/Attributes.js +1 -1
  191. package/src/renderers/common/Backend.js +19 -1
  192. package/src/renderers/common/Bindings.js +21 -18
  193. package/src/renderers/common/ChainMap.js +1 -1
  194. package/src/renderers/common/Color4.js +2 -2
  195. package/src/renderers/common/DataMap.js +1 -1
  196. package/src/renderers/common/Pipelines.js +1 -1
  197. package/src/renderers/common/PostProcessing.js +60 -5
  198. package/src/renderers/common/RenderContext.js +2 -2
  199. package/src/renderers/common/RenderObject.js +14 -2
  200. package/src/renderers/common/Renderer.js +55 -32
  201. package/src/renderers/common/SampledTexture.js +4 -72
  202. package/src/renderers/common/Sampler.js +91 -0
  203. package/src/renderers/common/Storage3DTexture.js +21 -0
  204. package/src/renderers/common/StorageArrayTexture.js +21 -0
  205. package/src/renderers/common/StorageTexture.js +19 -0
  206. package/src/renderers/common/Textures.js +52 -14
  207. package/src/renderers/common/TimestampQueryPool.js +3 -3
  208. package/src/renderers/common/XRManager.js +51 -17
  209. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  210. package/src/renderers/common/nodes/NodeLibrary.js +5 -5
  211. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  212. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  213. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  214. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  215. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  216. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  217. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  218. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  219. package/src/renderers/webgl/WebGLMaterials.js +6 -6
  220. package/src/renderers/webgl/WebGLProgram.js +24 -18
  221. package/src/renderers/webgl/WebGLPrograms.js +4 -4
  222. package/src/renderers/webgl/WebGLShadowMap.js +11 -1
  223. package/src/renderers/webgl/WebGLTextures.js +20 -7
  224. package/src/renderers/webgl/WebGLUtils.js +3 -2
  225. package/src/renderers/webgl-fallback/WebGLBackend.js +207 -146
  226. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +112 -19
  227. package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -1
  228. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +52 -3
  229. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -10
  230. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  231. package/src/renderers/webgpu/WebGPUBackend.js +87 -44
  232. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +169 -99
  233. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +35 -31
  234. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -2
  235. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +10 -19
  236. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +120 -84
  237. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +3 -3
  238. package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
  239. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  240. package/src/renderers/webxr/WebXRManager.js +86 -11
  241. package/src/textures/ExternalTexture.js +56 -0
  242. package/src/textures/FramebufferTexture.js +2 -2
  243. package/src/textures/Source.js +12 -2
  244. package/src/textures/VideoTexture.js +27 -2
  245. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
@@ -12,12 +12,9 @@ import { GLFeatureName } from './utils/WebGLConstants.js';
12
12
  import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
13
13
 
14
14
  import { warnOnce } from '../../utils.js';
15
- import { WebGLCoordinateSystem } from '../../constants.js';
16
- import { Vector2 } from '../../math/Vector2.js';
15
+ import { WebGLCoordinateSystem, TimestampQuery } from '../../constants.js';
17
16
  import WebGLTimestampQueryPool from './utils/WebGLTimestampQueryPool.js';
18
17
 
19
- const _drawingBufferSize = /*@__PURE__*/ new Vector2();
20
-
21
18
  /**
22
19
  * A backend implementation targeting WebGL 2.
23
20
  *
@@ -183,7 +180,7 @@ class WebGLBackend extends Backend {
183
180
  * A unique collection of bindings.
184
181
  *
185
182
  * @private
186
- * @type {WeakSet}
183
+ * @type {WeakSet<Array<BindGroup>>}
187
184
  */
188
185
  this._knownBindings = new WeakSet();
189
186
 
@@ -201,7 +198,7 @@ class WebGLBackend extends Backend {
201
198
  * the WebXR device API.
202
199
  *
203
200
  * @private
204
- * @type {WebGLFramebuffer}
201
+ * @type {?WebGLFramebuffer}
205
202
  * @default null
206
203
  */
207
204
  this._xrFramebuffer = null;
@@ -379,14 +376,13 @@ class WebGLBackend extends Backend {
379
376
  /**
380
377
  * Inits a time stamp query for the given render context.
381
378
  *
382
- * @param {RenderContext} renderContext - The render context.
379
+ * @param {string} type - The type of the timestamp query.
380
+ * @param {string} uid - A unique identifier for the timestamp query.
383
381
  */
384
- initTimestampQuery( renderContext ) {
382
+ initTimestampQuery( type, uid ) {
385
383
 
386
384
  if ( ! this.disjoint || ! this.trackTimestamp ) return;
387
385
 
388
- const type = renderContext.isComputeNode ? 'compute' : 'render';
389
-
390
386
  if ( ! this.timestampQueryPool[ type ] ) {
391
387
 
392
388
  // TODO: Variable maxQueries?
@@ -396,11 +392,11 @@ class WebGLBackend extends Backend {
396
392
 
397
393
  const timestampQueryPool = this.timestampQueryPool[ type ];
398
394
 
399
- const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext );
395
+ const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
400
396
 
401
397
  if ( baseOffset !== null ) {
402
398
 
403
- timestampQueryPool.beginQuery( renderContext );
399
+ timestampQueryPool.beginQuery( uid );
404
400
 
405
401
  }
406
402
 
@@ -411,16 +407,16 @@ class WebGLBackend extends Backend {
411
407
  /**
412
408
  * Prepares the timestamp buffer.
413
409
  *
414
- * @param {RenderContext} renderContext - The render context.
410
+ * @param {string} type - The type of the timestamp query.
411
+ * @param {string} uid - A unique identifier for the timestamp query.
415
412
  */
416
- prepareTimestampBuffer( renderContext ) {
413
+ prepareTimestampBuffer( type, uid ) {
417
414
 
418
415
  if ( ! this.disjoint || ! this.trackTimestamp ) return;
419
416
 
420
- const type = renderContext.isComputeNode ? 'compute' : 'render';
421
417
  const timestampQueryPool = this.timestampQueryPool[ type ];
422
418
 
423
- timestampQueryPool.endQuery( renderContext );
419
+ timestampQueryPool.endQuery( uid );
424
420
 
425
421
  }
426
422
 
@@ -449,13 +445,17 @@ class WebGLBackend extends Backend {
449
445
 
450
446
  //
451
447
 
448
+ renderContextData.frameCalls = this.renderer.info.render.frameCalls;
449
+
450
+ //
451
+
452
452
  if ( renderContext.viewport ) {
453
453
 
454
454
  this.updateViewport( renderContext );
455
455
 
456
456
  } else {
457
457
 
458
- const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
458
+ const { width, height } = this.getDrawingBufferSize();
459
459
  state.viewport( 0, 0, width, height );
460
460
 
461
461
  }
@@ -470,7 +470,7 @@ class WebGLBackend extends Backend {
470
470
 
471
471
  //
472
472
 
473
- this.initTimestampQuery( renderContext );
473
+ this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
474
474
 
475
475
  renderContextData.previousContext = this._currentContext;
476
476
  this._currentContext = renderContext;
@@ -543,107 +543,8 @@ class WebGLBackend extends Backend {
543
543
  }
544
544
 
545
545
  this._currentContext = previousContext;
546
- const renderTarget = renderContext.renderTarget;
547
-
548
- if ( renderContext.textures !== null && renderTarget ) {
549
-
550
- const renderTargetContextData = this.get( renderTarget );
551
-
552
- if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
553
-
554
- const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
555
546
 
556
- let mask = gl.COLOR_BUFFER_BIT;
557
-
558
- if ( renderTarget.resolveDepthBuffer ) {
559
-
560
- if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
561
- if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
562
-
563
- }
564
-
565
- const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
566
- const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
567
-
568
- const textures = renderContext.textures;
569
- const isMRT = textures.length > 1;
570
-
571
- state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
572
- state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
573
-
574
- if ( isMRT ) {
575
-
576
- // blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
577
- // the engine temporarily removes all attachments and then configures each attachment for the resolve.
578
-
579
- for ( let i = 0; i < textures.length; i ++ ) {
580
-
581
- gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
582
- gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
583
-
584
- }
585
-
586
- }
587
-
588
- for ( let i = 0; i < textures.length; i ++ ) {
589
-
590
- if ( isMRT ) {
591
-
592
- // configure attachment for resolve
593
-
594
- const { textureGPU } = this.get( textures[ i ] );
595
-
596
- gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
597
- gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
598
-
599
- }
600
-
601
- if ( renderContext.scissor ) {
602
-
603
- const { x, y, width, height } = renderContext.scissorValue;
604
-
605
- const viewY = renderContext.height - height - y;
606
-
607
- gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
608
-
609
- } else {
610
-
611
- gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
612
-
613
- }
614
-
615
- }
616
-
617
- if ( isMRT ) {
618
-
619
- // restore attachments
620
-
621
- for ( let i = 0; i < textures.length; i ++ ) {
622
-
623
- const { textureGPU } = this.get( textures[ i ] );
624
-
625
- gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
626
- gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
627
-
628
- }
629
-
630
- }
631
-
632
- if ( this._supportsInvalidateFramebuffer === true ) {
633
-
634
- gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
635
-
636
- }
637
-
638
- } else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
639
-
640
- const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
641
- state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
642
- gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
643
-
644
- }
645
-
646
- }
547
+ this._resolveRenderTarget( renderContext );
647
548
 
648
549
  if ( previousContext !== null ) {
649
550
 
@@ -655,14 +556,14 @@ class WebGLBackend extends Backend {
655
556
 
656
557
  } else {
657
558
 
658
- const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
559
+ const { width, height } = this.getDrawingBufferSize();
659
560
  state.viewport( 0, 0, width, height );
660
561
 
661
562
  }
662
563
 
663
564
  }
664
565
 
665
- this.prepareTimestampBuffer( renderContext );
566
+ this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
666
567
 
667
568
  }
668
569
 
@@ -802,9 +703,11 @@ class WebGLBackend extends Backend {
802
703
  * @param {boolean} depth - Whether the depth buffer should be cleared or not.
803
704
  * @param {boolean} stencil - Whether the stencil buffer should be cleared or not.
804
705
  * @param {?Object} [descriptor=null] - The render context of the current set render target.
805
- * @param {boolean} [setFrameBuffer=true] - TODO.
706
+ * @param {boolean} [setFrameBuffer=true] - Controls whether the intermediate framebuffer should be set or not.
707
+ * @param {boolean} [resolveRenderTarget=true] - Controls whether an active render target should be resolved
708
+ * or not. Only relevant for explicit clears.
806
709
  */
807
- clear( color, depth, stencil, descriptor = null, setFrameBuffer = true ) {
710
+ clear( color, depth, stencil, descriptor = null, setFrameBuffer = true, resolveRenderTarget = true ) {
808
711
 
809
712
  const { gl, renderer } = this;
810
713
 
@@ -887,6 +790,8 @@ class WebGLBackend extends Backend {
887
790
 
888
791
  }
889
792
 
793
+ if ( setFrameBuffer && resolveRenderTarget ) this._resolveRenderTarget( descriptor );
794
+
890
795
  }
891
796
 
892
797
  }
@@ -902,9 +807,16 @@ class WebGLBackend extends Backend {
902
807
  beginCompute( computeGroup ) {
903
808
 
904
809
  const { state, gl } = this;
810
+ const computeGroupData = this.get( computeGroup );
811
+
812
+ //
813
+
814
+ computeGroupData.frameCalls = this.renderer.info.compute.frameCalls;
815
+
816
+ //
905
817
 
906
818
  state.bindFramebuffer( gl.FRAMEBUFFER, null );
907
- this.initTimestampQuery( computeGroup );
819
+ this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
908
820
 
909
821
  }
910
822
 
@@ -915,8 +827,9 @@ class WebGLBackend extends Backend {
915
827
  * @param {Node} computeNode - The compute node.
916
828
  * @param {Array<BindGroup>} bindings - The bindings.
917
829
  * @param {ComputePipeline} pipeline - The compute pipeline.
830
+ * @param {?number} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.
918
831
  */
919
- compute( computeGroup, computeNode, bindings, pipeline ) {
832
+ compute( computeGroup, computeNode, bindings, pipeline, count = null ) {
920
833
 
921
834
  const { state, gl } = this;
922
835
 
@@ -953,13 +866,23 @@ class WebGLBackend extends Backend {
953
866
  gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
954
867
  gl.beginTransformFeedback( gl.POINTS );
955
868
 
869
+ count = ( count !== null ) ? count : computeNode.count;
870
+
871
+ if ( Array.isArray( count ) ) {
872
+
873
+ warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not an array.' );
874
+
875
+ count = count[ 0 ];
876
+
877
+ }
878
+
956
879
  if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
957
880
 
958
- gl.drawArraysInstanced( gl.POINTS, 0, 1, computeNode.count );
881
+ gl.drawArraysInstanced( gl.POINTS, 0, 1, count );
959
882
 
960
883
  } else {
961
884
 
962
- gl.drawArrays( gl.POINTS, 0, computeNode.count );
885
+ gl.drawArrays( gl.POINTS, 0, count );
963
886
 
964
887
  }
965
888
 
@@ -999,7 +922,7 @@ class WebGLBackend extends Backend {
999
922
 
1000
923
  gl.disable( gl.RASTERIZER_DISCARD );
1001
924
 
1002
- this.prepareTimestampBuffer( computeGroup );
925
+ this.prepareTimestampBuffer( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
1003
926
 
1004
927
  if ( this._currentContext ) {
1005
928
 
@@ -1238,7 +1161,7 @@ class WebGLBackend extends Backend {
1238
1161
  this._currentContext.activeCubeFace = i;
1239
1162
 
1240
1163
  this._setFramebuffer( this._currentContext );
1241
- this.clear( false, true, stencilBuffer, this._currentContext, false );
1164
+ this.clear( false, true, stencilBuffer, this._currentContext, false, false );
1242
1165
 
1243
1166
  }
1244
1167
 
@@ -1574,7 +1497,9 @@ class WebGLBackend extends Backend {
1574
1497
  _getShaderErrors( gl, shader, type ) {
1575
1498
 
1576
1499
  const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );
1577
- const errors = gl.getShaderInfoLog( shader ).trim();
1500
+
1501
+ const shaderInfoLog = gl.getShaderInfoLog( shader ) || '';
1502
+ const errors = shaderInfoLog.trim();
1578
1503
 
1579
1504
  if ( status && errors === '' ) return '';
1580
1505
 
@@ -1606,11 +1531,11 @@ class WebGLBackend extends Backend {
1606
1531
 
1607
1532
  const gl = this.gl;
1608
1533
 
1609
- const programLog = gl.getProgramInfoLog( programGPU ).trim();
1534
+ const programInfoLog = gl.getProgramInfoLog( programGPU ) || '';
1535
+ const programLog = programInfoLog.trim();
1610
1536
 
1611
1537
  if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
1612
1538
 
1613
-
1614
1539
  if ( typeof this.renderer.debug.onShaderError === 'function' ) {
1615
1540
 
1616
1541
  this.renderer.debug.onShaderError( gl, programGPU, glVertexShader, glFragmentShader );
@@ -1835,28 +1760,46 @@ class WebGLBackend extends Backend {
1835
1760
 
1836
1761
  for ( const binding of bindGroup.bindings ) {
1837
1762
 
1763
+ const map = this.get( binding );
1764
+
1838
1765
  if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1839
1766
 
1840
1767
  const data = binding.buffer;
1841
- const bufferGPU = gl.createBuffer();
1768
+ let { bufferGPU } = this.get( data );
1842
1769
 
1843
- gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1844
- gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1770
+ if ( bufferGPU === undefined ) {
1845
1771
 
1846
- this.set( binding, {
1847
- index: i ++,
1848
- bufferGPU
1849
- } );
1772
+ // create
1773
+
1774
+ bufferGPU = gl.createBuffer();
1775
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1776
+ gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1777
+
1778
+ this.set( data, { bufferGPU } );
1779
+
1780
+ } else {
1781
+
1782
+ // update
1783
+
1784
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1785
+ gl.bufferSubData( gl.UNIFORM_BUFFER, 0, data );
1786
+
1787
+ }
1788
+
1789
+ map.index = i ++;
1790
+ map.bufferGPU = bufferGPU;
1791
+
1792
+ this.set( binding, map );
1850
1793
 
1851
1794
  } else if ( binding.isSampledTexture ) {
1852
1795
 
1853
1796
  const { textureGPU, glTextureType } = this.get( binding.texture );
1854
1797
 
1855
- this.set( binding, {
1856
- index: t ++,
1857
- textureGPU,
1858
- glTextureType
1859
- } );
1798
+ map.index = t ++;
1799
+ map.textureGPU = textureGPU;
1800
+ map.glTextureType = glTextureType;
1801
+
1802
+ this.set( binding, map );
1860
1803
 
1861
1804
  }
1862
1805
 
@@ -2082,8 +2025,9 @@ class WebGLBackend extends Backend {
2082
2025
  const { textureGPU } = this.get( textures[ 0 ] );
2083
2026
 
2084
2027
  const cubeFace = this.renderer._activeCubeFace;
2028
+ const mipLevel = this.renderer._activeMipmapLevel;
2085
2029
 
2086
- gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
2030
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );
2087
2031
 
2088
2032
  } else {
2089
2033
 
@@ -2105,8 +2049,9 @@ class WebGLBackend extends Backend {
2105
2049
  } else if ( isRenderTarget3D || isRenderTargetArray ) {
2106
2050
 
2107
2051
  const layer = this.renderer._activeCubeFace;
2052
+ const mipLevel = this.renderer._activeMipmapLevel;
2108
2053
 
2109
- gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, layer );
2054
+ gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );
2110
2055
 
2111
2056
  } else {
2112
2057
 
@@ -2116,7 +2061,9 @@ class WebGLBackend extends Backend {
2116
2061
 
2117
2062
  } else {
2118
2063
 
2119
- gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2064
+ const mipLevel = this.renderer._activeMipmapLevel;
2065
+
2066
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );
2120
2067
 
2121
2068
  }
2122
2069
 
@@ -2533,6 +2480,120 @@ class WebGLBackend extends Backend {
2533
2480
 
2534
2481
  }
2535
2482
 
2483
+ /**
2484
+ * The method ensures multisampled render targets are resolved.
2485
+ *
2486
+ * @private
2487
+ * @param {RenderContext} renderContext - The render context.
2488
+ */
2489
+ _resolveRenderTarget( renderContext ) {
2490
+
2491
+ const { gl, state } = this;
2492
+
2493
+ const renderTarget = renderContext.renderTarget;
2494
+
2495
+ if ( renderContext.textures !== null && renderTarget ) {
2496
+
2497
+ const renderTargetContextData = this.get( renderTarget );
2498
+
2499
+ if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
2500
+
2501
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
2502
+
2503
+ let mask = gl.COLOR_BUFFER_BIT;
2504
+
2505
+ if ( renderTarget.resolveDepthBuffer ) {
2506
+
2507
+ if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
2508
+ if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
2509
+
2510
+ }
2511
+
2512
+ const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
2513
+ const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
2514
+
2515
+ const textures = renderContext.textures;
2516
+ const isMRT = textures.length > 1;
2517
+
2518
+ state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
2519
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
2520
+
2521
+ if ( isMRT ) {
2522
+
2523
+ // blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
2524
+ // the engine temporarily removes all attachments and then configures each attachment for the resolve.
2525
+
2526
+ for ( let i = 0; i < textures.length; i ++ ) {
2527
+
2528
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
2529
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
2530
+
2531
+ }
2532
+
2533
+ }
2534
+
2535
+ for ( let i = 0; i < textures.length; i ++ ) {
2536
+
2537
+ if ( isMRT ) {
2538
+
2539
+ // configure attachment for resolve
2540
+
2541
+ const { textureGPU } = this.get( textures[ i ] );
2542
+
2543
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
2544
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
2545
+
2546
+ }
2547
+
2548
+ if ( renderContext.scissor ) {
2549
+
2550
+ const { x, y, width, height } = renderContext.scissorValue;
2551
+
2552
+ const viewY = renderContext.height - height - y;
2553
+
2554
+ gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
2555
+
2556
+ } else {
2557
+
2558
+ gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
2559
+
2560
+ }
2561
+
2562
+ }
2563
+
2564
+ if ( isMRT ) {
2565
+
2566
+ // restore attachments
2567
+
2568
+ for ( let i = 0; i < textures.length; i ++ ) {
2569
+
2570
+ const { textureGPU } = this.get( textures[ i ] );
2571
+
2572
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
2573
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
2574
+
2575
+ }
2576
+
2577
+ }
2578
+
2579
+ if ( this._supportsInvalidateFramebuffer === true ) {
2580
+
2581
+ gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
2582
+
2583
+ }
2584
+
2585
+ } else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
2586
+
2587
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
2588
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
2589
+ gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
2590
+
2591
+ }
2592
+
2593
+ }
2594
+
2595
+ }
2596
+
2536
2597
  /**
2537
2598
  * Returns `true` if the `WEBGL_multisampled_render_to_texture` extension
2538
2599
  * should be used when MSAA is enabled.