super-three 0.177.0 → 0.181.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 (501) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +1994 -749
  3. package/build/three.core.js +1358 -506
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +631 -247
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +113 -33
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +9571 -3424
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +9397 -3426
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  14. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  15. package/examples/jsm/Addons.js +2 -3
  16. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  17. package/examples/jsm/capabilities/WebGL.js +0 -27
  18. package/examples/jsm/capabilities/WebGPU.js +1 -1
  19. package/examples/jsm/controls/ArcballControls.js +9 -9
  20. package/examples/jsm/controls/DragControls.js +7 -57
  21. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  22. package/examples/jsm/controls/FlyControls.js +1 -1
  23. package/examples/jsm/controls/OrbitControls.js +2 -2
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +1 -1
  26. package/examples/jsm/controls/TransformControls.js +62 -15
  27. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  28. package/examples/jsm/effects/AsciiEffect.js +8 -8
  29. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  30. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  31. package/examples/jsm/exporters/EXRExporter.js +1 -1
  32. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  33. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  34. package/examples/jsm/exporters/PLYExporter.js +1 -1
  35. package/examples/jsm/exporters/USDZExporter.js +683 -299
  36. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  37. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  38. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  39. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  40. package/examples/jsm/geometries/TextGeometry.js +3 -2
  41. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  42. package/examples/jsm/helpers/ViewHelper.js +43 -5
  43. package/examples/jsm/inspector/Inspector.js +427 -0
  44. package/examples/jsm/inspector/RendererInspector.js +415 -0
  45. package/examples/jsm/inspector/tabs/Console.js +204 -0
  46. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  47. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  48. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  49. package/examples/jsm/inspector/ui/Graph.js +95 -0
  50. package/examples/jsm/inspector/ui/Item.js +170 -0
  51. package/examples/jsm/inspector/ui/List.js +75 -0
  52. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  53. package/examples/jsm/inspector/ui/Style.js +654 -0
  54. package/examples/jsm/inspector/ui/Tab.js +46 -0
  55. package/examples/jsm/inspector/ui/Values.js +423 -0
  56. package/examples/jsm/inspector/ui/utils.js +56 -0
  57. package/examples/jsm/interactive/HTMLMesh.js +11 -13
  58. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  59. package/examples/jsm/interactive/SelectionBox.js +30 -0
  60. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  61. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  62. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  63. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  64. package/examples/jsm/lines/Line2.js +3 -3
  65. package/examples/jsm/lines/LineGeometry.js +1 -1
  66. package/examples/jsm/lines/LineSegments2.js +2 -2
  67. package/examples/jsm/lines/Wireframe.js +2 -2
  68. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  69. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  70. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  71. package/examples/jsm/loaders/3MFLoader.js +1 -1
  72. package/examples/jsm/loaders/ColladaLoader.js +4 -4
  73. package/examples/jsm/loaders/DDSLoader.js +1 -1
  74. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  75. package/examples/jsm/loaders/EXRLoader.js +210 -22
  76. package/examples/jsm/loaders/FBXLoader.js +4 -4
  77. package/examples/jsm/loaders/FontLoader.js +23 -5
  78. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  79. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  80. package/examples/jsm/loaders/HDRLoader.js +486 -0
  81. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  82. package/examples/jsm/loaders/KTXLoader.js +2 -2
  83. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  84. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  85. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  86. package/examples/jsm/loaders/LWOLoader.js +2 -2
  87. package/examples/jsm/loaders/MaterialXLoader.js +233 -34
  88. package/examples/jsm/loaders/OBJLoader.js +1 -1
  89. package/examples/jsm/loaders/PDBLoader.js +1 -1
  90. package/examples/jsm/loaders/RGBELoader.js +7 -473
  91. package/examples/jsm/loaders/SVGLoader.js +2 -2
  92. package/examples/jsm/loaders/TTFLoader.js +13 -1
  93. package/examples/jsm/loaders/USDLoader.js +219 -0
  94. package/examples/jsm/loaders/USDZLoader.js +4 -892
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  96. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  97. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  98. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  99. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  100. package/examples/jsm/math/ColorSpaces.js +19 -1
  101. package/examples/jsm/math/ConvexHull.js +3 -3
  102. package/examples/jsm/math/ImprovedNoise.js +1 -1
  103. package/examples/jsm/math/Lut.js +2 -2
  104. package/examples/jsm/math/SimplexNoise.js +1 -1
  105. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  106. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  107. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  108. package/examples/jsm/misc/TubePainter.js +383 -40
  109. package/examples/jsm/misc/Volume.js +1 -1
  110. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  111. package/examples/jsm/objects/LensflareMesh.js +3 -3
  112. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  113. package/examples/jsm/objects/Sky.js +1 -1
  114. package/examples/jsm/objects/SkyMesh.js +3 -3
  115. package/examples/jsm/objects/Water.js +3 -3
  116. package/examples/jsm/objects/WaterMesh.js +6 -6
  117. package/examples/jsm/physics/RapierPhysics.js +95 -16
  118. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  119. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  120. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  121. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  122. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  123. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  124. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  125. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  126. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  127. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  128. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  129. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  130. package/examples/jsm/shaders/BokehShader.js +1 -1
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  133. package/examples/jsm/shaders/FocusShader.js +1 -1
  134. package/examples/jsm/shaders/GTAOShader.js +2 -2
  135. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  136. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  137. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  138. package/examples/jsm/shaders/SSRShader.js +1 -1
  139. package/examples/jsm/shaders/SepiaShader.js +1 -1
  140. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  141. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  142. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  143. package/examples/jsm/shaders/VignetteShader.js +1 -1
  144. package/examples/jsm/transpiler/AST.js +381 -30
  145. package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
  146. package/examples/jsm/transpiler/Linker.js +327 -0
  147. package/examples/jsm/transpiler/TSLEncoder.js +196 -92
  148. package/examples/jsm/transpiler/Transpiler.js +17 -1
  149. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  150. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  151. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  152. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  153. package/examples/jsm/tsl/display/BloomNode.js +11 -6
  154. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  155. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  156. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  157. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  158. package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
  159. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  160. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  161. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  162. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  163. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  164. package/examples/jsm/tsl/display/TRAANode.js +578 -0
  165. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  166. package/examples/jsm/tsl/display/hashBlur.js +18 -20
  167. package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
  168. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  169. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  170. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  171. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  172. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  173. package/package.json +5 -10
  174. package/src/Three.Core.js +5 -2
  175. package/src/Three.TSL.js +112 -32
  176. package/src/Three.WebGPU.Nodes.js +2 -0
  177. package/src/Three.WebGPU.js +4 -0
  178. package/src/animation/AnimationClip.js +20 -4
  179. package/src/animation/AnimationMixer.js +3 -3
  180. package/src/animation/AnimationObjectGroup.js +2 -1
  181. package/src/animation/KeyframeTrack.js +8 -7
  182. package/src/animation/PropertyBinding.js +12 -11
  183. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  184. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  185. package/src/audio/Audio.js +10 -9
  186. package/src/audio/PositionalAudio.js +1 -1
  187. package/src/cameras/Camera.js +14 -0
  188. package/src/cameras/OrthographicCamera.js +2 -2
  189. package/src/cameras/PerspectiveCamera.js +2 -2
  190. package/src/cameras/StereoCamera.js +2 -2
  191. package/src/constants.js +13 -5
  192. package/src/core/BufferAttribute.js +3 -3
  193. package/src/core/BufferGeometry.js +10 -10
  194. package/src/core/Clock.js +2 -8
  195. package/src/core/EventDispatcher.js +1 -1
  196. package/src/core/GLBufferAttribute.js +13 -1
  197. package/src/core/InterleavedBuffer.js +1 -1
  198. package/src/core/InterleavedBufferAttribute.js +3 -2
  199. package/src/core/Object3D.js +4 -3
  200. package/src/core/Raycaster.js +2 -1
  201. package/src/core/RenderTarget.js +10 -1
  202. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  203. package/src/extras/Controls.js +5 -4
  204. package/src/extras/DataUtils.js +2 -1
  205. package/src/extras/Earcut.js +6 -0
  206. package/src/extras/ImageUtils.js +2 -2
  207. package/src/extras/PMREMGenerator.js +279 -55
  208. package/src/extras/TextureUtils.js +2 -1
  209. package/src/extras/core/Curve.js +2 -1
  210. package/src/extras/core/Interpolations.js +7 -1
  211. package/src/extras/core/Path.js +22 -22
  212. package/src/extras/core/ShapePath.js +4 -4
  213. package/src/extras/lib/earcut.js +8 -8
  214. package/src/geometries/BoxGeometry.js +1 -0
  215. package/src/geometries/CapsuleGeometry.js +1 -0
  216. package/src/geometries/CircleGeometry.js +1 -0
  217. package/src/geometries/ConeGeometry.js +1 -0
  218. package/src/geometries/CylinderGeometry.js +1 -0
  219. package/src/geometries/DodecahedronGeometry.js +1 -0
  220. package/src/geometries/ExtrudeGeometry.js +8 -6
  221. package/src/geometries/IcosahedronGeometry.js +1 -0
  222. package/src/geometries/LatheGeometry.js +1 -0
  223. package/src/geometries/OctahedronGeometry.js +1 -0
  224. package/src/geometries/PlaneGeometry.js +1 -0
  225. package/src/geometries/RingGeometry.js +1 -0
  226. package/src/geometries/ShapeGeometry.js +1 -0
  227. package/src/geometries/SphereGeometry.js +1 -0
  228. package/src/geometries/TetrahedronGeometry.js +1 -0
  229. package/src/geometries/TorusGeometry.js +1 -0
  230. package/src/geometries/TorusKnotGeometry.js +1 -0
  231. package/src/geometries/TubeGeometry.js +1 -0
  232. package/src/helpers/CameraHelper.js +42 -12
  233. package/src/helpers/SkeletonHelper.js +35 -6
  234. package/src/lights/LightShadow.js +21 -8
  235. package/src/lights/PointLightShadow.js +1 -1
  236. package/src/lights/webgpu/ProjectorLight.js +1 -1
  237. package/src/loaders/AnimationLoader.js +2 -1
  238. package/src/loaders/AudioLoader.js +2 -1
  239. package/src/loaders/BufferGeometryLoader.js +2 -2
  240. package/src/loaders/Cache.js +2 -2
  241. package/src/loaders/DataTextureLoader.js +1 -1
  242. package/src/loaders/FileLoader.js +29 -5
  243. package/src/loaders/ImageBitmapLoader.js +32 -8
  244. package/src/loaders/ImageLoader.js +56 -9
  245. package/src/loaders/Loader.js +17 -3
  246. package/src/loaders/LoadingManager.js +45 -0
  247. package/src/loaders/MaterialLoader.js +3 -2
  248. package/src/loaders/ObjectLoader.js +13 -13
  249. package/src/loaders/TextureLoader.js +1 -1
  250. package/src/loaders/nodes/NodeLoader.js +3 -2
  251. package/src/materials/Material.js +16 -3
  252. package/src/materials/MeshBasicMaterial.js +2 -1
  253. package/src/materials/MeshDepthMaterial.js +1 -0
  254. package/src/materials/MeshDistanceMaterial.js +1 -1
  255. package/src/materials/MeshLambertMaterial.js +2 -1
  256. package/src/materials/MeshMatcapMaterial.js +22 -0
  257. package/src/materials/MeshNormalMaterial.js +1 -0
  258. package/src/materials/MeshPhongMaterial.js +2 -1
  259. package/src/materials/MeshPhysicalMaterial.js +2 -1
  260. package/src/materials/MeshStandardMaterial.js +8 -7
  261. package/src/materials/MeshToonMaterial.js +1 -0
  262. package/src/materials/PointsMaterial.js +1 -1
  263. package/src/materials/ShaderMaterial.js +2 -2
  264. package/src/materials/nodes/Line2NodeMaterial.js +2 -10
  265. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  266. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  267. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  268. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  269. package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
  270. package/src/materials/nodes/NodeMaterial.js +90 -27
  271. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  272. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  273. package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
  274. package/src/math/Color.js +6 -5
  275. package/src/math/ColorManagement.js +9 -3
  276. package/src/math/Cylindrical.js +1 -1
  277. package/src/math/Euler.js +2 -1
  278. package/src/math/Frustum.js +25 -9
  279. package/src/math/FrustumArray.js +10 -5
  280. package/src/math/Line3.js +129 -2
  281. package/src/math/MathUtils.js +13 -11
  282. package/src/math/Matrix2.js +1 -1
  283. package/src/math/Matrix3.js +2 -2
  284. package/src/math/Matrix4.js +55 -34
  285. package/src/math/Plane.js +1 -1
  286. package/src/math/Quaternion.js +69 -67
  287. package/src/math/Spherical.js +3 -3
  288. package/src/nodes/Nodes.js +6 -4
  289. package/src/nodes/TSL.js +9 -4
  290. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  291. package/src/nodes/accessors/Bitangent.js +31 -25
  292. package/src/nodes/accessors/BufferNode.js +1 -1
  293. package/src/nodes/accessors/Camera.js +142 -16
  294. package/src/nodes/accessors/ClippingNode.js +6 -5
  295. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  296. package/src/nodes/accessors/InstanceNode.js +25 -5
  297. package/src/nodes/accessors/Lights.js +10 -0
  298. package/src/nodes/accessors/Normal.js +97 -30
  299. package/src/nodes/accessors/Object3DNode.js +2 -2
  300. package/src/nodes/accessors/Position.js +25 -9
  301. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  302. package/src/nodes/accessors/ReferenceNode.js +20 -4
  303. package/src/nodes/accessors/ReflectVector.js +3 -3
  304. package/src/nodes/accessors/SceneNode.js +3 -2
  305. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  306. package/src/nodes/accessors/StorageTextureNode.js +23 -1
  307. package/src/nodes/accessors/Tangent.js +25 -17
  308. package/src/nodes/accessors/TangentUtils.js +46 -0
  309. package/src/nodes/accessors/Texture3DNode.js +14 -1
  310. package/src/nodes/accessors/TextureBicubic.js +21 -3
  311. package/src/nodes/accessors/TextureNode.js +142 -44
  312. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  313. package/src/nodes/code/FunctionCallNode.js +24 -4
  314. package/src/nodes/code/FunctionNode.js +23 -0
  315. package/src/nodes/core/ArrayNode.js +13 -0
  316. package/src/nodes/core/AssignNode.js +6 -2
  317. package/src/nodes/core/AttributeNode.js +2 -1
  318. package/src/nodes/core/ContextNode.js +48 -10
  319. package/src/nodes/core/IndexNode.js +2 -2
  320. package/src/nodes/core/InputNode.js +2 -1
  321. package/src/nodes/core/InspectorNode.js +128 -0
  322. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
  323. package/src/nodes/core/Node.js +167 -34
  324. package/src/nodes/core/NodeBuilder.js +404 -120
  325. package/src/nodes/core/NodeFrame.js +21 -21
  326. package/src/nodes/core/NodeFunction.js +2 -1
  327. package/src/nodes/core/NodeParser.js +2 -1
  328. package/src/nodes/core/NodeUniform.js +1 -1
  329. package/src/nodes/core/NodeUtils.js +17 -88
  330. package/src/nodes/core/ParameterNode.js +31 -0
  331. package/src/nodes/core/PropertyNode.js +7 -0
  332. package/src/nodes/core/StackNode.js +77 -30
  333. package/src/nodes/core/StructNode.js +5 -5
  334. package/src/nodes/core/StructTypeNode.js +1 -0
  335. package/src/nodes/core/SubBuildNode.js +89 -0
  336. package/src/nodes/core/UniformNode.js +80 -14
  337. package/src/nodes/core/VarNode.js +142 -16
  338. package/src/nodes/core/VaryingNode.js +9 -6
  339. package/src/nodes/display/BlendModes.js +7 -6
  340. package/src/nodes/display/BumpMapNode.js +1 -1
  341. package/src/nodes/display/ColorAdjustment.js +1 -1
  342. package/src/nodes/display/FrontFacingNode.js +35 -7
  343. package/src/nodes/display/NormalMapNode.js +20 -50
  344. package/src/nodes/display/PassNode.js +206 -17
  345. package/src/nodes/display/RenderOutputNode.js +28 -2
  346. package/src/nodes/display/ScreenNode.js +44 -40
  347. package/src/nodes/display/ToneMappingNode.js +31 -4
  348. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  349. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  350. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  351. package/src/nodes/display/ViewportTextureNode.js +94 -4
  352. package/src/nodes/fog/Fog.js +3 -2
  353. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  354. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  355. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  356. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  357. package/src/nodes/functions/BasicLightingModel.js +2 -1
  358. package/src/nodes/functions/PhongLightingModel.js +3 -3
  359. package/src/nodes/functions/PhysicalLightingModel.js +19 -18
  360. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  361. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  362. package/src/nodes/geometry/RangeNode.js +40 -4
  363. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  364. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  365. package/src/nodes/gpgpu/ComputeNode.js +81 -25
  366. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  367. package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
  368. package/src/nodes/lighting/EnvironmentNode.js +11 -11
  369. package/src/nodes/lighting/LightsNode.js +7 -8
  370. package/src/nodes/lighting/PointShadowNode.js +6 -0
  371. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  372. package/src/nodes/lighting/ShadowFilterNode.js +3 -1
  373. package/src/nodes/lighting/ShadowNode.js +77 -10
  374. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  375. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  376. package/src/nodes/math/BitcastNode.js +156 -0
  377. package/src/nodes/math/ConditionalNode.js +25 -27
  378. package/src/nodes/math/MathNode.js +106 -65
  379. package/src/nodes/math/OperatorNode.js +28 -43
  380. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  381. package/src/nodes/shapes/Shapes.js +1 -1
  382. package/src/nodes/tsl/TSLBase.js +6 -2
  383. package/src/nodes/tsl/TSLCore.js +546 -186
  384. package/src/nodes/utils/DebugNode.js +3 -2
  385. package/src/nodes/utils/EquirectUV.js +27 -0
  386. package/src/nodes/utils/EventNode.js +119 -0
  387. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  388. package/src/nodes/utils/JoinNode.js +6 -3
  389. package/src/nodes/utils/LoopNode.js +20 -41
  390. package/src/nodes/utils/MatcapUV.js +22 -0
  391. package/src/nodes/utils/MemberNode.js +59 -7
  392. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  393. package/src/nodes/utils/RTTNode.js +33 -6
  394. package/src/nodes/utils/ReflectorNode.js +68 -10
  395. package/src/nodes/utils/SampleNode.js +91 -0
  396. package/src/nodes/utils/SplitNode.js +11 -0
  397. package/src/nodes/utils/Timer.js +0 -47
  398. package/src/nodes/utils/TriplanarTextures.js +65 -0
  399. package/src/objects/BatchedMesh.js +6 -4
  400. package/src/objects/LOD.js +1 -1
  401. package/src/objects/Line.js +2 -1
  402. package/src/objects/LineSegments.js +2 -1
  403. package/src/objects/Skeleton.js +3 -2
  404. package/src/objects/SkinnedMesh.js +3 -1
  405. package/src/objects/Sprite.js +4 -3
  406. package/src/renderers/WebGLRenderer.js +77 -66
  407. package/src/renderers/common/Animation.js +13 -1
  408. package/src/renderers/common/Attributes.js +1 -1
  409. package/src/renderers/common/Backend.js +108 -27
  410. package/src/renderers/common/Background.js +4 -3
  411. package/src/renderers/common/Bindings.js +76 -19
  412. package/src/renderers/common/CanvasTarget.js +341 -0
  413. package/src/renderers/common/ChainMap.js +1 -1
  414. package/src/renderers/common/Color4.js +2 -2
  415. package/src/renderers/common/CubeRenderTarget.js +1 -1
  416. package/src/renderers/common/DataMap.js +1 -1
  417. package/src/renderers/common/Geometries.js +26 -0
  418. package/src/renderers/common/Info.js +4 -2
  419. package/src/renderers/common/InspectorBase.js +146 -0
  420. package/src/renderers/common/Pipelines.js +1 -1
  421. package/src/renderers/common/PostProcessing.js +61 -25
  422. package/src/renderers/common/QuadMesh.js +7 -1
  423. package/src/renderers/common/RenderContext.js +2 -2
  424. package/src/renderers/common/RenderList.js +7 -3
  425. package/src/renderers/common/RenderObject.js +84 -5
  426. package/src/renderers/common/RenderObjects.js +1 -1
  427. package/src/renderers/common/Renderer.js +486 -255
  428. package/src/renderers/common/RendererUtils.js +9 -0
  429. package/src/renderers/common/SampledTexture.js +8 -68
  430. package/src/renderers/common/Sampler.js +117 -0
  431. package/src/renderers/common/Storage3DTexture.js +100 -0
  432. package/src/renderers/common/StorageArrayTexture.js +84 -0
  433. package/src/renderers/common/StorageTexture.js +27 -0
  434. package/src/renderers/common/Textures.js +138 -46
  435. package/src/renderers/common/TimestampQueryPool.js +65 -3
  436. package/src/renderers/common/UniformsGroup.js +2 -1
  437. package/src/renderers/common/XRManager.js +63 -24
  438. package/src/renderers/common/XRRenderTarget.js +21 -4
  439. package/src/renderers/common/extras/PMREMGenerator.js +161 -66
  440. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  441. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  442. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  443. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  444. package/src/renderers/common/nodes/Nodes.js +38 -16
  445. package/src/renderers/shaders/DFGLUTData.js +64 -0
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  447. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  450. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  451. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  454. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  455. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  456. package/src/renderers/shaders/UniformsLib.js +1 -0
  457. package/src/renderers/shaders/UniformsUtils.js +25 -4
  458. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  459. package/src/renderers/webgl/WebGLCapabilities.js +4 -3
  460. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  461. package/src/renderers/webgl/WebGLInfo.js +3 -1
  462. package/src/renderers/webgl/WebGLProgram.js +25 -18
  463. package/src/renderers/webgl/WebGLPrograms.js +9 -6
  464. package/src/renderers/webgl/WebGLShadowMap.js +13 -2
  465. package/src/renderers/webgl/WebGLState.js +17 -16
  466. package/src/renderers/webgl/WebGLTextures.js +38 -21
  467. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  468. package/src/renderers/webgl/WebGLUtils.js +3 -2
  469. package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
  470. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
  471. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  472. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  473. package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
  474. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
  475. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  476. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  477. package/src/renderers/webgpu/WebGPUBackend.js +205 -128
  478. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  479. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  480. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
  481. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
  482. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
  483. package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
  484. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
  485. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  486. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
  487. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  488. package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
  489. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  490. package/src/renderers/webxr/WebXRManager.js +89 -13
  491. package/src/textures/ExternalTexture.js +56 -0
  492. package/src/textures/FramebufferTexture.js +2 -2
  493. package/src/textures/Source.js +14 -3
  494. package/src/textures/Texture.js +3 -2
  495. package/src/textures/VideoTexture.js +29 -2
  496. package/src/utils.js +67 -3
  497. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  498. package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
  499. package/src/nodes/utils/EquirectUVNode.js +0 -65
  500. package/src/nodes/utils/MatcapUVNode.js +0 -49
  501. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -11,13 +11,10 @@ import WebGLCapabilities from './utils/WebGLCapabilities.js';
11
11
  import { GLFeatureName } from './utils/WebGLConstants.js';
12
12
  import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
13
13
 
14
- import { warnOnce } from '../../utils.js';
15
- import { WebGLCoordinateSystem } from '../../constants.js';
16
- import { Vector2 } from '../../math/Vector2.js';
14
+ import { warnOnce, warn, error } from '../../utils.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;
@@ -222,7 +219,7 @@ class WebGLBackend extends Backend {
222
219
  const parameters = this.parameters;
223
220
 
224
221
  const contextAttributes = {
225
- antialias: renderer.samples > 0,
222
+ antialias: renderer.currentSamples > 0,
226
223
  alpha: true, // always true for performance reasons
227
224
  depth: renderer.depth,
228
225
  stencil: renderer.stencil
@@ -300,19 +297,6 @@ class WebGLBackend extends Backend {
300
297
 
301
298
  }
302
299
 
303
- /**
304
- * Can be used to synchronize CPU operations with GPU tasks. So when this method is called,
305
- * the CPU waits for the GPU to complete its operation (e.g. a compute task).
306
- *
307
- * @async
308
- * @return {Promise} A Promise that resolves when synchronization has been finished.
309
- */
310
- async waitForGPU() {
311
-
312
- await this.utils._clientWaitAsync();
313
-
314
- }
315
-
316
300
  /**
317
301
  * Ensures the backend is XR compatible.
318
302
  *
@@ -364,13 +348,13 @@ class WebGLBackend extends Backend {
364
348
 
365
349
  // The multisample_render_to_texture extension doesn't work properly if there
366
350
  // are midframe flushes and an external depth texture.
367
- if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget.autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
351
+ if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
368
352
 
369
- console.warn( 'THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
353
+ warn( 'WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
370
354
 
371
355
  }
372
356
 
373
- renderTarget.autoAllocateDepthBuffer = false;
357
+ renderTarget._autoAllocateDepthBuffer = false;
374
358
 
375
359
  }
376
360
 
@@ -379,14 +363,13 @@ class WebGLBackend extends Backend {
379
363
  /**
380
364
  * Inits a time stamp query for the given render context.
381
365
  *
382
- * @param {RenderContext} renderContext - The render context.
366
+ * @param {string} type - The type of the timestamp query.
367
+ * @param {string} uid - A unique identifier for the timestamp query.
383
368
  */
384
- initTimestampQuery( renderContext ) {
369
+ initTimestampQuery( type, uid ) {
385
370
 
386
371
  if ( ! this.disjoint || ! this.trackTimestamp ) return;
387
372
 
388
- const type = renderContext.isComputeNode ? 'compute' : 'render';
389
-
390
373
  if ( ! this.timestampQueryPool[ type ] ) {
391
374
 
392
375
  // TODO: Variable maxQueries?
@@ -396,11 +379,11 @@ class WebGLBackend extends Backend {
396
379
 
397
380
  const timestampQueryPool = this.timestampQueryPool[ type ];
398
381
 
399
- const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext );
382
+ const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
400
383
 
401
384
  if ( baseOffset !== null ) {
402
385
 
403
- timestampQueryPool.beginQuery( renderContext );
386
+ timestampQueryPool.beginQuery( uid );
404
387
 
405
388
  }
406
389
 
@@ -411,16 +394,16 @@ class WebGLBackend extends Backend {
411
394
  /**
412
395
  * Prepares the timestamp buffer.
413
396
  *
414
- * @param {RenderContext} renderContext - The render context.
397
+ * @param {string} type - The type of the timestamp query.
398
+ * @param {string} uid - A unique identifier for the timestamp query.
415
399
  */
416
- prepareTimestampBuffer( renderContext ) {
400
+ prepareTimestampBuffer( type, uid ) {
417
401
 
418
402
  if ( ! this.disjoint || ! this.trackTimestamp ) return;
419
403
 
420
- const type = renderContext.isComputeNode ? 'compute' : 'render';
421
404
  const timestampQueryPool = this.timestampQueryPool[ type ];
422
405
 
423
- timestampQueryPool.endQuery( renderContext );
406
+ timestampQueryPool.endQuery( uid );
424
407
 
425
408
  }
426
409
 
@@ -455,7 +438,7 @@ class WebGLBackend extends Backend {
455
438
 
456
439
  } else {
457
440
 
458
- const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
441
+ const { width, height } = this.getDrawingBufferSize();
459
442
  state.viewport( 0, 0, width, height );
460
443
 
461
444
  }
@@ -470,7 +453,7 @@ class WebGLBackend extends Backend {
470
453
 
471
454
  //
472
455
 
473
- this.initTimestampQuery( renderContext );
456
+ this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
474
457
 
475
458
  renderContextData.previousContext = this._currentContext;
476
459
  this._currentContext = renderContext;
@@ -544,66 +527,7 @@ class WebGLBackend extends Backend {
544
527
 
545
528
  this._currentContext = previousContext;
546
529
 
547
- if ( renderContext.textures !== null && renderContext.renderTarget ) {
548
-
549
- const renderTargetContextData = this.get( renderContext.renderTarget );
550
-
551
- const { resolveDepthBuffer, samples } = renderContext.renderTarget;
552
-
553
- if ( samples > 0 && this._useMultisampledExtension( renderContext.renderTarget ) === false ) {
554
-
555
- const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
556
-
557
- const mask = gl.COLOR_BUFFER_BIT;
558
-
559
- const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
560
-
561
- const textures = renderContext.textures;
562
-
563
- state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
564
- state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
565
-
566
- for ( let i = 0; i < textures.length; i ++ ) {
567
-
568
- // TODO Add support for MRT
569
-
570
- if ( renderContext.scissor ) {
571
-
572
- const { x, y, width, height } = renderContext.scissorValue;
573
-
574
- const viewY = renderContext.height - height - y;
575
-
576
- gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
577
-
578
- if ( this._supportsInvalidateFramebuffer === true ) {
579
-
580
- gl.invalidateSubFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray, x, viewY, width, height );
581
-
582
- }
583
-
584
- } else {
585
-
586
- gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
587
-
588
- if ( this._supportsInvalidateFramebuffer === true ) {
589
-
590
- gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
591
-
592
- }
593
-
594
- }
595
-
596
- }
597
-
598
- } else if ( resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
599
-
600
- const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
601
- state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
602
- gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
603
-
604
- }
605
-
606
- }
530
+ this._resolveRenderTarget( renderContext );
607
531
 
608
532
  if ( previousContext !== null ) {
609
533
 
@@ -615,14 +539,14 @@ class WebGLBackend extends Backend {
615
539
 
616
540
  } else {
617
541
 
618
- const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
542
+ const { width, height } = this.getDrawingBufferSize();
619
543
  state.viewport( 0, 0, width, height );
620
544
 
621
545
  }
622
546
 
623
547
  }
624
548
 
625
- this.prepareTimestampBuffer( renderContext );
549
+ this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
626
550
 
627
551
  }
628
552
 
@@ -762,9 +686,11 @@ class WebGLBackend extends Backend {
762
686
  * @param {boolean} depth - Whether the depth buffer should be cleared or not.
763
687
  * @param {boolean} stencil - Whether the stencil buffer should be cleared or not.
764
688
  * @param {?Object} [descriptor=null] - The render context of the current set render target.
765
- * @param {boolean} [setFrameBuffer=true] - TODO.
689
+ * @param {boolean} [setFrameBuffer=true] - Controls whether the intermediate framebuffer should be set or not.
690
+ * @param {boolean} [resolveRenderTarget=true] - Controls whether an active render target should be resolved
691
+ * or not. Only relevant for explicit clears.
766
692
  */
767
- clear( color, depth, stencil, descriptor = null, setFrameBuffer = true ) {
693
+ clear( color, depth, stencil, descriptor = null, setFrameBuffer = true, resolveRenderTarget = true ) {
768
694
 
769
695
  const { gl, renderer } = this;
770
696
 
@@ -847,6 +773,8 @@ class WebGLBackend extends Backend {
847
773
 
848
774
  }
849
775
 
776
+ if ( setFrameBuffer && resolveRenderTarget ) this._resolveRenderTarget( descriptor );
777
+
850
778
  }
851
779
 
852
780
  }
@@ -863,8 +791,10 @@ class WebGLBackend extends Backend {
863
791
 
864
792
  const { state, gl } = this;
865
793
 
794
+ //
795
+
866
796
  state.bindFramebuffer( gl.FRAMEBUFFER, null );
867
- this.initTimestampQuery( computeGroup );
797
+ this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
868
798
 
869
799
  }
870
800
 
@@ -875,8 +805,9 @@ class WebGLBackend extends Backend {
875
805
  * @param {Node} computeNode - The compute node.
876
806
  * @param {Array<BindGroup>} bindings - The bindings.
877
807
  * @param {ComputePipeline} pipeline - The compute pipeline.
808
+ * @param {?number} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.
878
809
  */
879
- compute( computeGroup, computeNode, bindings, pipeline ) {
810
+ compute( computeGroup, computeNode, bindings, pipeline, count = null ) {
880
811
 
881
812
  const { state, gl } = this;
882
813
 
@@ -896,7 +827,7 @@ class WebGLBackend extends Backend {
896
827
 
897
828
  if ( vaoGPU === undefined ) {
898
829
 
899
- this._createVao( attributes );
830
+ this.vaoCache[ vaoKey ] = this._createVao( attributes );
900
831
 
901
832
  } else {
902
833
 
@@ -913,13 +844,29 @@ class WebGLBackend extends Backend {
913
844
  gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
914
845
  gl.beginTransformFeedback( gl.POINTS );
915
846
 
847
+ count = ( count !== null ) ? count : computeNode.count;
848
+
849
+ if ( Array.isArray( count ) ) {
850
+
851
+ warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not an array.' );
852
+
853
+ count = count[ 0 ];
854
+
855
+ } else if ( count && typeof count === 'object' && count.isIndirectStorageBufferAttribute ) {
856
+
857
+ warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not IndirectStorageBufferAttribute' );
858
+
859
+ count = computeNode.count;
860
+
861
+ }
862
+
916
863
  if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
917
864
 
918
- gl.drawArraysInstanced( gl.POINTS, 0, 1, computeNode.count );
865
+ gl.drawArraysInstanced( gl.POINTS, 0, 1, count );
919
866
 
920
867
  } else {
921
868
 
922
- gl.drawArrays( gl.POINTS, 0, computeNode.count );
869
+ gl.drawArrays( gl.POINTS, 0, count );
923
870
 
924
871
  }
925
872
 
@@ -932,7 +879,7 @@ class WebGLBackend extends Backend {
932
879
 
933
880
  const dualAttributeData = transformBuffers[ i ];
934
881
 
935
- if ( dualAttributeData.pbo ) {
882
+ if ( dualAttributeData.pbo && this.has( dualAttributeData.pbo ) ) {
936
883
 
937
884
  this.textureUtils.copyBufferToTexture( dualAttributeData.transformBuffer, dualAttributeData.pbo );
938
885
 
@@ -959,7 +906,7 @@ class WebGLBackend extends Backend {
959
906
 
960
907
  gl.disable( gl.RASTERIZER_DISCARD );
961
908
 
962
- this.prepareTimestampBuffer( computeGroup );
909
+ this.prepareTimestampBuffer( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
963
910
 
964
911
  if ( this._currentContext ) {
965
912
 
@@ -1014,28 +961,23 @@ class WebGLBackend extends Backend {
1014
961
 
1015
962
  // vertex state
1016
963
 
1017
- const renderObjectData = this.get( renderObject );
964
+ const attributes = renderObject.getAttributes();
965
+ const attributesData = this.get( attributes );
1018
966
 
1019
- let vaoGPU = renderObjectData.staticVao;
967
+ let vaoGPU = attributesData.vaoGPU;
1020
968
 
1021
- if ( vaoGPU === undefined || renderObjectData.geometryId !== renderObject.geometry.id ) {
969
+ if ( vaoGPU === undefined ) {
1022
970
 
1023
- const vaoKey = this._getVaoKey( renderObject.getAttributes() );
971
+ const vaoKey = this._getVaoKey( attributes );
1024
972
 
1025
973
  vaoGPU = this.vaoCache[ vaoKey ];
1026
974
 
1027
975
  if ( vaoGPU === undefined ) {
1028
976
 
1029
- let staticVao;
1030
-
1031
- ( { vaoGPU, staticVao } = this._createVao( renderObject.getAttributes() ) );
1032
-
1033
- if ( staticVao ) {
977
+ vaoGPU = this._createVao( attributes );
1034
978
 
1035
- renderObjectData.staticVao = vaoGPU;
1036
- renderObjectData.geometryId = renderObject.geometry.id;
1037
-
1038
- }
979
+ this.vaoCache[ vaoKey ] = vaoGPU;
980
+ attributesData.vaoGPU = vaoGPU;
1039
981
 
1040
982
  }
1041
983
 
@@ -1126,12 +1068,12 @@ class WebGLBackend extends Backend {
1126
1068
  if ( object._multiDrawInstances !== null ) {
1127
1069
 
1128
1070
  // @deprecated, r174
1129
- warnOnce( 'THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
1071
+ warnOnce( 'WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
1130
1072
  renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
1131
1073
 
1132
1074
  } else if ( ! this.hasFeature( 'WEBGL_multi_draw' ) ) {
1133
1075
 
1134
- warnOnce( 'THREE.WebGLRenderer: WEBGL_multi_draw not supported.' );
1076
+ warnOnce( 'WebGLBackend: WEBGL_multi_draw not supported.' );
1135
1077
 
1136
1078
  } else {
1137
1079
 
@@ -1203,7 +1145,7 @@ class WebGLBackend extends Backend {
1203
1145
  this._currentContext.activeCubeFace = i;
1204
1146
 
1205
1147
  this._setFramebuffer( this._currentContext );
1206
- this.clear( false, true, stencilBuffer, this._currentContext, false );
1148
+ this.clear( false, true, stencilBuffer, this._currentContext, false, false );
1207
1149
 
1208
1150
  }
1209
1151
 
@@ -1344,10 +1286,11 @@ class WebGLBackend extends Backend {
1344
1286
  * Destroys the GPU data for the given texture object.
1345
1287
  *
1346
1288
  * @param {Texture} texture - The texture.
1289
+ * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
1347
1290
  */
1348
- destroyTexture( texture ) {
1291
+ destroyTexture( texture, isDefaultTexture = false ) {
1349
1292
 
1350
- this.textureUtils.destroyTexture( texture );
1293
+ this.textureUtils.destroyTexture( texture, isDefaultTexture );
1351
1294
 
1352
1295
  }
1353
1296
 
@@ -1372,21 +1315,15 @@ class WebGLBackend extends Backend {
1372
1315
  /**
1373
1316
  * This method does nothing since WebGL 2 has no concept of samplers.
1374
1317
  *
1375
- * @param {Texture} texture - The texture to create the sampler for.
1318
+ * @param {Texture} texture - The texture to update the sampler for.
1319
+ * @return {string} The current sampler key.
1376
1320
  */
1377
- createSampler( /*texture*/ ) {
1321
+ updateSampler( /*texture*/ ) {
1378
1322
 
1379
- //console.warn( 'Abstract class.' );
1323
+ return '';
1380
1324
 
1381
1325
  }
1382
1326
 
1383
- /**
1384
- * This method does nothing since WebGL 2 has no concept of samplers.
1385
- *
1386
- * @param {Texture} texture - The texture to destroy the sampler for.
1387
- */
1388
- destroySampler( /*texture*/ ) {}
1389
-
1390
1327
  // node builder
1391
1328
 
1392
1329
  /**
@@ -1539,7 +1476,9 @@ class WebGLBackend extends Backend {
1539
1476
  _getShaderErrors( gl, shader, type ) {
1540
1477
 
1541
1478
  const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );
1542
- const errors = gl.getShaderInfoLog( shader ).trim();
1479
+
1480
+ const shaderInfoLog = gl.getShaderInfoLog( shader ) || '';
1481
+ const errors = shaderInfoLog.trim();
1543
1482
 
1544
1483
  if ( status && errors === '' ) return '';
1545
1484
 
@@ -1571,11 +1510,11 @@ class WebGLBackend extends Backend {
1571
1510
 
1572
1511
  const gl = this.gl;
1573
1512
 
1574
- const programLog = gl.getProgramInfoLog( programGPU ).trim();
1513
+ const programInfoLog = gl.getProgramInfoLog( programGPU ) || '';
1514
+ const programLog = programInfoLog.trim();
1575
1515
 
1576
1516
  if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
1577
1517
 
1578
-
1579
1518
  if ( typeof this.renderer.debug.onShaderError === 'function' ) {
1580
1519
 
1581
1520
  this.renderer.debug.onShaderError( gl, programGPU, glVertexShader, glFragmentShader );
@@ -1587,7 +1526,7 @@ class WebGLBackend extends Backend {
1587
1526
  const vertexErrors = this._getShaderErrors( gl, glVertexShader, 'vertex' );
1588
1527
  const fragmentErrors = this._getShaderErrors( gl, glFragmentShader, 'fragment' );
1589
1528
 
1590
- console.error(
1529
+ error(
1591
1530
  'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
1592
1531
  'VALIDATE_STATUS ' + gl.getProgramParameter( programGPU, gl.VALIDATE_STATUS ) + '\n\n' +
1593
1532
  'Program Info Log: ' + programLog + '\n' +
@@ -1599,7 +1538,7 @@ class WebGLBackend extends Backend {
1599
1538
 
1600
1539
  } else if ( programLog !== '' ) {
1601
1540
 
1602
- console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );
1541
+ warn( 'WebGLProgram: Program Info Log:', programLog );
1603
1542
 
1604
1543
  }
1605
1544
 
@@ -1800,28 +1739,46 @@ class WebGLBackend extends Backend {
1800
1739
 
1801
1740
  for ( const binding of bindGroup.bindings ) {
1802
1741
 
1742
+ const map = this.get( binding );
1743
+
1803
1744
  if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1804
1745
 
1805
1746
  const data = binding.buffer;
1806
- const bufferGPU = gl.createBuffer();
1747
+ let { bufferGPU } = this.get( data );
1807
1748
 
1808
- gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1809
- gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1749
+ if ( bufferGPU === undefined ) {
1810
1750
 
1811
- this.set( binding, {
1812
- index: i ++,
1813
- bufferGPU
1814
- } );
1751
+ // create
1752
+
1753
+ bufferGPU = gl.createBuffer();
1754
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1755
+ gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1756
+
1757
+ this.set( data, { bufferGPU } );
1758
+
1759
+ } else {
1760
+
1761
+ // update
1762
+
1763
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1764
+ gl.bufferSubData( gl.UNIFORM_BUFFER, 0, data );
1765
+
1766
+ }
1767
+
1768
+ map.index = i ++;
1769
+ map.bufferGPU = bufferGPU;
1770
+
1771
+ this.set( binding, map );
1815
1772
 
1816
1773
  } else if ( binding.isSampledTexture ) {
1817
1774
 
1818
1775
  const { textureGPU, glTextureType } = this.get( binding.texture );
1819
1776
 
1820
- this.set( binding, {
1821
- index: t ++,
1822
- textureGPU,
1823
- glTextureType
1824
- } );
1777
+ map.index = t ++;
1778
+ map.textureGPU = textureGPU;
1779
+ map.glTextureType = glTextureType;
1780
+
1781
+ this.set( binding, map );
1825
1782
 
1826
1783
  }
1827
1784
 
@@ -2002,7 +1959,7 @@ class WebGLBackend extends Backend {
2002
1959
  const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
2003
1960
  const isRenderTargetArray = renderTarget.depth > 1;
2004
1961
  const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
2005
- const hasExternalTextures = ( isXRRenderTarget === true && renderTarget.hasExternalTextures === true );
1962
+ const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );
2006
1963
 
2007
1964
  let msaaFb = renderTargetContextData.msaaFrameBuffer;
2008
1965
  let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
@@ -2019,7 +1976,7 @@ class WebGLBackend extends Backend {
2019
1976
 
2020
1977
  fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
2021
1978
 
2022
- } else if ( isXRRenderTarget && hasExternalTextures === false ) {
1979
+ } else if ( isXRRenderTarget && _hasExternalTextures === false ) {
2023
1980
 
2024
1981
  fb = this._xrFramebuffer;
2025
1982
 
@@ -2047,8 +2004,9 @@ class WebGLBackend extends Backend {
2047
2004
  const { textureGPU } = this.get( textures[ 0 ] );
2048
2005
 
2049
2006
  const cubeFace = this.renderer._activeCubeFace;
2007
+ const mipLevel = this.renderer._activeMipmapLevel;
2050
2008
 
2051
- gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
2009
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );
2052
2010
 
2053
2011
  } else {
2054
2012
 
@@ -2070,8 +2028,9 @@ class WebGLBackend extends Backend {
2070
2028
  } else if ( isRenderTarget3D || isRenderTargetArray ) {
2071
2029
 
2072
2030
  const layer = this.renderer._activeCubeFace;
2031
+ const mipLevel = this.renderer._activeMipmapLevel;
2073
2032
 
2074
- gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, layer );
2033
+ gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );
2075
2034
 
2076
2035
  } else {
2077
2036
 
@@ -2081,7 +2040,9 @@ class WebGLBackend extends Backend {
2081
2040
 
2082
2041
  } else {
2083
2042
 
2084
- gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2043
+ const mipLevel = this.renderer._activeMipmapLevel;
2044
+
2045
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );
2085
2046
 
2086
2047
  }
2087
2048
 
@@ -2089,13 +2050,11 @@ class WebGLBackend extends Backend {
2089
2050
 
2090
2051
  }
2091
2052
 
2092
- state.drawBuffers( descriptor, fb );
2093
-
2094
2053
  }
2095
2054
 
2096
2055
  const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2097
2056
 
2098
- if ( renderTarget.autoAllocateDepthBuffer === true ) {
2057
+ if ( renderTarget._autoAllocateDepthBuffer === true ) {
2099
2058
 
2100
2059
  const renderbuffer = gl.createRenderbuffer();
2101
2060
  this.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );
@@ -2120,7 +2079,7 @@ class WebGLBackend extends Backend {
2120
2079
 
2121
2080
  multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
2122
2081
 
2123
- } else if ( hasExternalTextures && useMultisampledRTT ) {
2082
+ } else if ( _hasExternalTextures && useMultisampledRTT ) {
2124
2083
 
2125
2084
  multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2126
2085
 
@@ -2171,7 +2130,7 @@ class WebGLBackend extends Backend {
2171
2130
 
2172
2131
  // rebind external XR textures
2173
2132
 
2174
- if ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) {
2133
+ if ( ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) && ( renderTarget._isOpaqueFramebuffer !== true ) ) {
2175
2134
 
2176
2135
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
2177
2136
 
@@ -2197,7 +2156,7 @@ class WebGLBackend extends Backend {
2197
2156
 
2198
2157
  const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2199
2158
 
2200
- if ( renderTarget.autoAllocateDepthBuffer === true ) {
2159
+ if ( renderTarget._autoAllocateDepthBuffer === true ) {
2201
2160
 
2202
2161
  const renderbuffer = renderTargetContextData.xrDepthRenderbuffer;
2203
2162
  gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
@@ -2249,13 +2208,6 @@ class WebGLBackend extends Backend {
2249
2208
 
2250
2209
  invalidationArray.push( gl.COLOR_ATTACHMENT0 + i );
2251
2210
 
2252
- if ( depthBuffer ) {
2253
-
2254
- const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2255
- invalidationArray.push( depthStyle );
2256
-
2257
- }
2258
-
2259
2211
  const texture = descriptor.textures[ i ];
2260
2212
  const textureData = this.get( texture );
2261
2213
 
@@ -2265,10 +2217,12 @@ class WebGLBackend extends Backend {
2265
2217
 
2266
2218
  }
2267
2219
 
2220
+ gl.bindRenderbuffer( gl.RENDERBUFFER, null );
2221
+
2268
2222
  renderTargetContextData.msaaFrameBuffer = msaaFb;
2269
2223
  renderTargetContextData.msaaRenderbuffers = msaaRenderbuffers;
2270
2224
 
2271
- if ( depthRenderbuffer === undefined ) {
2225
+ if ( depthBuffer && depthRenderbuffer === undefined ) {
2272
2226
 
2273
2227
  depthRenderbuffer = gl.createRenderbuffer();
2274
2228
  this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor, samples );
@@ -2292,6 +2246,8 @@ class WebGLBackend extends Backend {
2292
2246
 
2293
2247
  }
2294
2248
 
2249
+ state.drawBuffers( descriptor, fb );
2250
+
2295
2251
  }
2296
2252
 
2297
2253
  state.bindFramebuffer( gl.FRAMEBUFFER, currentFrameBuffer );
@@ -2333,9 +2289,6 @@ class WebGLBackend extends Backend {
2333
2289
  const { gl } = this;
2334
2290
 
2335
2291
  const vaoGPU = gl.createVertexArray();
2336
- let key = '';
2337
-
2338
- let staticVao = true;
2339
2292
 
2340
2293
  gl.bindVertexArray( vaoGPU );
2341
2294
 
@@ -2344,13 +2297,9 @@ class WebGLBackend extends Backend {
2344
2297
  const attribute = attributes[ i ];
2345
2298
  const attributeData = this.get( attribute );
2346
2299
 
2347
- key += ':' + attributeData.id;
2348
-
2349
2300
  gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
2350
2301
  gl.enableVertexAttribArray( i );
2351
2302
 
2352
- if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) staticVao = false;
2353
-
2354
2303
  let stride, offset;
2355
2304
 
2356
2305
  if ( attribute.isInterleavedBufferAttribute === true ) {
@@ -2389,9 +2338,7 @@ class WebGLBackend extends Backend {
2389
2338
 
2390
2339
  gl.bindBuffer( gl.ARRAY_BUFFER, null );
2391
2340
 
2392
- this.vaoCache[ key ] = vaoGPU;
2393
-
2394
- return { vaoGPU, staticVao };
2341
+ return vaoGPU;
2395
2342
 
2396
2343
  }
2397
2344
 
@@ -2512,6 +2459,120 @@ class WebGLBackend extends Backend {
2512
2459
 
2513
2460
  }
2514
2461
 
2462
+ /**
2463
+ * The method ensures multisampled render targets are resolved.
2464
+ *
2465
+ * @private
2466
+ * @param {RenderContext} renderContext - The render context.
2467
+ */
2468
+ _resolveRenderTarget( renderContext ) {
2469
+
2470
+ const { gl, state } = this;
2471
+
2472
+ const renderTarget = renderContext.renderTarget;
2473
+
2474
+ if ( renderContext.textures !== null && renderTarget ) {
2475
+
2476
+ const renderTargetContextData = this.get( renderTarget );
2477
+
2478
+ if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
2479
+
2480
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
2481
+
2482
+ let mask = gl.COLOR_BUFFER_BIT;
2483
+
2484
+ if ( renderTarget.resolveDepthBuffer ) {
2485
+
2486
+ if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
2487
+ if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
2488
+
2489
+ }
2490
+
2491
+ const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
2492
+ const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
2493
+
2494
+ const textures = renderContext.textures;
2495
+ const isMRT = textures.length > 1;
2496
+
2497
+ state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
2498
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
2499
+
2500
+ if ( isMRT ) {
2501
+
2502
+ // blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
2503
+ // the engine temporarily removes all attachments and then configures each attachment for the resolve.
2504
+
2505
+ for ( let i = 0; i < textures.length; i ++ ) {
2506
+
2507
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
2508
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
2509
+
2510
+ }
2511
+
2512
+ }
2513
+
2514
+ for ( let i = 0; i < textures.length; i ++ ) {
2515
+
2516
+ if ( isMRT ) {
2517
+
2518
+ // configure attachment for resolve
2519
+
2520
+ const { textureGPU } = this.get( textures[ i ] );
2521
+
2522
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
2523
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
2524
+
2525
+ }
2526
+
2527
+ if ( renderContext.scissor ) {
2528
+
2529
+ const { x, y, width, height } = renderContext.scissorValue;
2530
+
2531
+ const viewY = renderContext.height - height - y;
2532
+
2533
+ gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
2534
+
2535
+ } else {
2536
+
2537
+ gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
2538
+
2539
+ }
2540
+
2541
+ }
2542
+
2543
+ if ( isMRT ) {
2544
+
2545
+ // restore attachments
2546
+
2547
+ for ( let i = 0; i < textures.length; i ++ ) {
2548
+
2549
+ const { textureGPU } = this.get( textures[ i ] );
2550
+
2551
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
2552
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
2553
+
2554
+ }
2555
+
2556
+ }
2557
+
2558
+ if ( this._supportsInvalidateFramebuffer === true ) {
2559
+
2560
+ gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
2561
+
2562
+ }
2563
+
2564
+ } else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
2565
+
2566
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
2567
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
2568
+ gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
2569
+
2570
+ }
2571
+
2572
+ }
2573
+
2574
+ }
2575
+
2515
2576
  /**
2516
2577
  * Returns `true` if the `WEBGL_multisampled_render_to_texture` extension
2517
2578
  * should be used when MSAA is enabled.
@@ -2528,7 +2589,7 @@ class WebGLBackend extends Backend {
2528
2589
 
2529
2590
  }
2530
2591
 
2531
- return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget.autoAllocateDepthBuffer !== false;
2592
+ return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget._autoAllocateDepthBuffer !== false;
2532
2593
 
2533
2594
  }
2534
2595
 
@@ -2537,6 +2598,8 @@ class WebGLBackend extends Backend {
2537
2598
  */
2538
2599
  dispose() {
2539
2600
 
2601
+ if ( this.textureUtils !== null ) this.textureUtils.dispose();
2602
+
2540
2603
  const extension = this.extensions.get( 'WEBGL_lose_context' );
2541
2604
  if ( extension ) extension.loseContext();
2542
2605