@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -1,8 +1,10 @@
1
1
  import GLSLNodeBuilder from './nodes/GLSLNodeBuilder.js';
2
2
  import Backend from '../common/Backend.js';
3
3
  import { getCacheKey } from '../common/RenderContext.js';
4
+ import { AttributeType } from '../common/Constants.js';
4
5
 
5
6
  import WebGLAttributeUtils from './utils/WebGLAttributeUtils.js';
7
+ import WebGLVertexArrayUtils from './utils/WebGLVertexArrayUtils.js';
6
8
  import WebGLState from './utils/WebGLState.js';
7
9
  import WebGLUtils from './utils/WebGLUtils.js';
8
10
  import WebGLTextureUtils from './utils/WebGLTextureUtils.js';
@@ -67,6 +69,15 @@ class WebGLBackend extends Backend {
67
69
  */
68
70
  this.attributeUtils = null;
69
71
 
72
+ /**
73
+ * A reference to a backend module holding vertex array object-related
74
+ * utility functions.
75
+ *
76
+ * @type {?WebGLVertexArrayUtils}
77
+ * @default null
78
+ */
79
+ this.vertexArrayUtils = null;
80
+
70
81
  /**
71
82
  * A reference to a backend module holding extension-related
72
83
  * utility functions.
@@ -129,20 +140,6 @@ class WebGLBackend extends Backend {
129
140
  */
130
141
  this.utils = null;
131
142
 
132
- /**
133
- * Dictionary for caching VAOs.
134
- *
135
- * @type {Object<string,WebGLVertexArrayObject>}
136
- */
137
- this.vaoCache = {};
138
-
139
- /**
140
- * Dictionary for caching transform feedback objects.
141
- *
142
- * @type {Object<string,WebGLTransformFeedback>}
143
- */
144
- this.transformFeedbackCache = {};
145
-
146
143
  /**
147
144
  * Controls if `gl.RASTERIZER_DISCARD` should be enabled or not.
148
145
  * Only relevant when using compute shaders.
@@ -253,6 +250,7 @@ class WebGLBackend extends Backend {
253
250
  this.extensions = new WebGLExtensions( this );
254
251
  this.capabilities = new WebGLCapabilities( this );
255
252
  this.attributeUtils = new WebGLAttributeUtils( this );
253
+ this.vertexArrayUtils = new WebGLVertexArrayUtils( this );
256
254
  this.textureUtils = new WebGLTextureUtils( this );
257
255
  this.bufferRenderer = new WebGLBufferRenderer( this );
258
256
 
@@ -328,10 +326,10 @@ class WebGLBackend extends Backend {
328
326
  * new allocation.
329
327
  *
330
328
  * @async
331
- * @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
332
- * @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
333
- * @param {number} offset - The storage buffer attribute.
334
- * @param {number} count - The offset from which to start reading the
329
+ * @param {BufferAttribute} attribute - The storage buffer attribute to read from.
330
+ * @param {?(ReadbackBuffer|ArrayBuffer)} [target=null] - The readback buffer or array buffer that receives the data. If `null`, a new array buffer is returned.
331
+ * @param {number} [offset=0] - The byte offset to start reading from. Must be a multiple of 4.
332
+ * @param {number} [count=-1] - The number of bytes to read. Must be a multiple of 4, or `-1` to read to the end of the buffer.
335
333
  * @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
336
334
  */
337
335
  async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
@@ -381,13 +379,19 @@ class WebGLBackend extends Backend {
381
379
 
382
380
  const gl = this.gl;
383
381
 
384
- this.set( renderTarget.texture, { textureGPU: colorTexture, glInternalFormat: gl.RGBA8 } ); // see #24698 why RGBA8 and not SRGB8_ALPHA8 is used
382
+ this.set( renderTarget.texture, {
383
+ textureGPU: colorTexture,
384
+ glTextureType: this.textureUtils.getGLTextureType( renderTarget.texture ),
385
+ glInternalFormat: gl.RGBA8 // see #24698 why RGBA8 and not SRGB8_ALPHA8 is used
386
+ } );
385
387
 
386
388
  if ( depthTexture !== null ) {
387
389
 
388
- const glInternalFormat = renderTarget.stencilBuffer ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;
389
-
390
- this.set( renderTarget.depthTexture, { textureGPU: depthTexture, glInternalFormat: glInternalFormat } );
390
+ this.set( renderTarget.depthTexture, {
391
+ textureGPU: depthTexture,
392
+ glTextureType: this.textureUtils.getGLTextureType( renderTarget.depthTexture ),
393
+ glInternalFormat: renderTarget.stencilBuffer ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24
394
+ } );
391
395
 
392
396
  // The multisample_render_to_texture extension doesn't work properly if there
393
397
  // are midframe flushes and an external depth texture.
@@ -481,7 +485,7 @@ class WebGLBackend extends Backend {
481
485
 
482
486
  } else {
483
487
 
484
- const { width, height } = this.getDrawingBufferSize();
488
+ const { width, height } = renderContext;
485
489
  state.viewport( 0, 0, width, height );
486
490
 
487
491
  }
@@ -492,11 +496,13 @@ class WebGLBackend extends Backend {
492
496
 
493
497
  } else {
494
498
 
495
- const { width, height } = this.getDrawingBufferSize();
499
+ const { width, height } = renderContext;
496
500
  state.scissor( 0, 0, width, height );
497
501
 
498
502
  }
499
503
 
504
+ state.setScissorTest( renderContext.scissor );
505
+
500
506
  //
501
507
 
502
508
  this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
@@ -508,24 +514,25 @@ class WebGLBackend extends Backend {
508
514
  this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );
509
515
 
510
516
  const occlusionQueryCount = renderContext.occlusionQueryCount;
517
+ const occlusionData = this.getOcclusionData( renderContext );
511
518
 
512
519
  if ( occlusionQueryCount > 0 ) {
513
520
 
514
- // Get a reference to the array of objects with queries. The renderContextData property
521
+ // Get a reference to the array of objects with queries. The occlusionData property
515
522
  // can be changed by another render pass before the async reading of all previous queries complete
516
- renderContextData.currentOcclusionQueries = renderContextData.occlusionQueries;
517
- renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
523
+ occlusionData.currentOcclusionQueries = occlusionData.occlusionQueries;
524
+ occlusionData.currentOcclusionQueryObjects = occlusionData.occlusionQueryObjects;
518
525
 
519
- renderContextData.lastOcclusionObject = null;
520
- renderContextData.occlusionQueries = new Array( occlusionQueryCount );
521
- renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
522
- renderContextData.occlusionQueryIndex = 0;
526
+ occlusionData.lastOcclusionObject = null;
527
+ occlusionData.occlusionQueries = new Array( occlusionQueryCount );
528
+ occlusionData.occlusionQueryObjects = new Array( occlusionQueryCount );
529
+ occlusionData.occlusionQueryIndex = 0;
523
530
 
524
- } else if ( renderContextData.lastOcclusionObject !== undefined ) {
531
+ } else if ( occlusionData.lastOcclusionObject !== undefined ) {
525
532
 
526
533
  // invalidate if there is a stale query
527
534
 
528
- renderContextData.lastOcclusionObject = undefined;
535
+ occlusionData.lastOcclusionObject = undefined;
529
536
 
530
537
  }
531
538
 
@@ -549,7 +556,7 @@ class WebGLBackend extends Backend {
549
556
 
550
557
  if ( occlusionQueryCount > 0 ) {
551
558
 
552
- const lastOcclusionObject = renderContextData.lastOcclusionObject;
559
+ const lastOcclusionObject = this.getOcclusionData( renderContext ).lastOcclusionObject;
553
560
 
554
561
  if ( lastOcclusionObject && lastOcclusionObject.occlusionTest === true ) {
555
562
 
@@ -569,7 +576,7 @@ class WebGLBackend extends Backend {
569
576
 
570
577
  const texture = textures[ i ];
571
578
 
572
- if ( texture.generateMipmaps ) {
579
+ if ( texture.generateMipmaps === true && texture.mipmapsAutoUpdate === true ) {
573
580
 
574
581
  this.generateMipmaps( texture );
575
582
 
@@ -593,7 +600,7 @@ class WebGLBackend extends Backend {
593
600
 
594
601
  } else {
595
602
 
596
- const { width, height } = this.getDrawingBufferSize();
603
+ const { width, height } = previousContext;
597
604
  state.viewport( 0, 0, width, height );
598
605
 
599
606
  }
@@ -604,11 +611,13 @@ class WebGLBackend extends Backend {
604
611
 
605
612
  } else {
606
613
 
607
- const { width, height } = this.getDrawingBufferSize();
614
+ const { width, height } = previousContext;
608
615
  state.scissor( 0, 0, width, height );
609
616
 
610
617
  }
611
618
 
619
+ state.setScissorTest( previousContext.scissor );
620
+
612
621
  }
613
622
 
614
623
  this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
@@ -617,26 +626,26 @@ class WebGLBackend extends Backend {
617
626
 
618
627
  /**
619
628
  * This method processes the result of occlusion queries and writes it
620
- * into render context data.
629
+ * into the occlusion data of the render context.
621
630
  *
622
631
  * @async
623
632
  * @param {RenderContext} renderContext - The render context.
624
633
  */
625
634
  resolveOccludedAsync( renderContext ) {
626
635
 
627
- const renderContextData = this.get( renderContext );
636
+ const occlusionData = this.getOcclusionData( renderContext );
628
637
 
629
638
  // handle occlusion query results
630
639
 
631
- const { currentOcclusionQueries, currentOcclusionQueryObjects } = renderContextData;
640
+ const { currentOcclusionQueries, currentOcclusionQueryObjects } = occlusionData;
632
641
 
633
642
  if ( currentOcclusionQueries && currentOcclusionQueryObjects ) {
634
643
 
635
644
  const occluded = new WeakSet();
636
645
  const { gl } = this;
637
646
 
638
- renderContextData.currentOcclusionQueryObjects = null;
639
- renderContextData.currentOcclusionQueries = null;
647
+ occlusionData.currentOcclusionQueryObjects = null;
648
+ occlusionData.currentOcclusionQueries = null;
640
649
 
641
650
  const check = () => {
642
651
 
@@ -670,7 +679,7 @@ class WebGLBackend extends Backend {
670
679
 
671
680
  } else {
672
681
 
673
- renderContextData.occluded = occluded;
682
+ occlusionData.occluded = occluded;
674
683
 
675
684
  }
676
685
 
@@ -692,9 +701,9 @@ class WebGLBackend extends Backend {
692
701
  */
693
702
  isOccluded( renderContext, object ) {
694
703
 
695
- const renderContextData = this.get( renderContext );
704
+ const occlusionData = this.getOcclusionData( renderContext );
696
705
 
697
- return renderContextData.occluded && renderContextData.occluded.has( object );
706
+ return occlusionData.occluded && occlusionData.occluded.has( object );
698
707
 
699
708
  }
700
709
 
@@ -820,6 +829,7 @@ class WebGLBackend extends Backend {
820
829
  const clearDepth = renderer.getClearDepth();
821
830
  const clearStencil = renderer.getClearStencil();
822
831
 
832
+ if ( color ) this.state.setColorMask( true );
823
833
  if ( depth ) this.state.setDepthMask( true );
824
834
  if ( stencil ) this.state.setStencilMask( 0xffffffff );
825
835
 
@@ -927,29 +937,30 @@ class WebGLBackend extends Backend {
927
937
 
928
938
  }
929
939
 
930
- const { programGPU, transformBuffers, attributes } = this.get( pipeline );
940
+ const { programGPU, transformAttributes, attributes } = this.get( pipeline );
931
941
 
932
- const vaoKey = this._getVaoKey( attributes );
942
+ // the buffers are managed by the renderer's attributes so they are re-created after disposal
933
943
 
934
- const vaoGPU = this.vaoCache[ vaoKey ];
944
+ for ( let i = 0; i < attributes.length; i ++ ) this._updateComputeAttribute( attributes[ i ] );
945
+ for ( let i = 0; i < transformAttributes.length; i ++ ) this._updateComputeAttribute( transformAttributes[ i ] );
935
946
 
936
- if ( vaoGPU === undefined ) {
947
+ const vaoGPU = this.vertexArrayUtils.getVAO( pipeline, attributes );
937
948
 
938
- this.vaoCache[ vaoKey ] = this._createVao( attributes );
949
+ state.setVertexState( vaoGPU );
939
950
 
940
- } else {
951
+ state.useProgram( programGPU );
941
952
 
942
- state.setVertexState( vaoGPU );
953
+ this._bindUniforms( bindings );
943
954
 
944
- }
955
+ // the buffers are only bound to the default transform feedback object during the dispatch so
956
+ // no transform feedback object keeps the memory of disposed buffers allocated
945
957
 
946
- state.useProgram( programGPU );
958
+ for ( let i = 0; i < transformAttributes.length; i ++ ) {
947
959
 
948
- this._bindUniforms( bindings );
960
+ gl.bindBufferBase( gl.TRANSFORM_FEEDBACK_BUFFER, i, this.get( transformAttributes[ i ] ).transformBuffer );
949
961
 
950
- const transformFeedbackGPU = this._getTransformFeedback( transformBuffers );
962
+ }
951
963
 
952
- gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
953
964
  gl.beginTransformFeedback( gl.POINTS );
954
965
 
955
966
  count = ( count !== null ) ? count : computeNode.count;
@@ -979,13 +990,18 @@ class WebGLBackend extends Backend {
979
990
  }
980
991
 
981
992
  gl.endTransformFeedback();
982
- gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, null );
993
+
994
+ for ( let i = 0; i < transformAttributes.length; i ++ ) {
995
+
996
+ gl.bindBufferBase( gl.TRANSFORM_FEEDBACK_BUFFER, i, null );
997
+
998
+ }
983
999
 
984
1000
  // switch active buffers
985
1001
 
986
- for ( let i = 0; i < transformBuffers.length; i ++ ) {
1002
+ for ( let i = 0; i < transformAttributes.length; i ++ ) {
987
1003
 
988
- const dualAttributeData = transformBuffers[ i ];
1004
+ const dualAttributeData = this.get( transformAttributes[ i ] );
989
1005
 
990
1006
  if ( dualAttributeData.pbo && this.has( dualAttributeData.pbo ) ) {
991
1007
 
@@ -1000,6 +1016,22 @@ class WebGLBackend extends Backend {
1000
1016
 
1001
1017
  }
1002
1018
 
1019
+ /**
1020
+ * Creates or updates the GPU buffer of the given compute attribute via the renderer's
1021
+ * attributes so it is tracked like other attributes.
1022
+ *
1023
+ * @private
1024
+ * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The buffer attribute.
1025
+ */
1026
+ _updateComputeAttribute( attribute ) {
1027
+
1028
+ const bufferAttribute = this.getBufferAttribute( attribute );
1029
+ const attributeType = ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) ? AttributeType.STORAGE : AttributeType.VERTEX;
1030
+
1031
+ this.renderer._attributes.update( bufferAttribute, attributeType );
1032
+
1033
+ }
1034
+
1003
1035
  /**
1004
1036
  * This method is executed at the end of a compute call and
1005
1037
  * finalizes work after compute tasks.
@@ -1101,8 +1133,6 @@ class WebGLBackend extends Backend {
1101
1133
 
1102
1134
  const { gl, state } = this;
1103
1135
 
1104
- const contextData = this.get( context );
1105
-
1106
1136
  const drawParams = renderObject.getDrawParameters();
1107
1137
 
1108
1138
  if ( drawParams === null ) return;
@@ -1125,60 +1155,45 @@ class WebGLBackend extends Backend {
1125
1155
 
1126
1156
  // vertex state
1127
1157
 
1128
- const attributes = renderObject.getAttributes();
1129
- const attributesData = this.get( attributes );
1130
-
1131
- let vaoGPU = attributesData.vaoGPU;
1132
-
1133
- if ( vaoGPU === undefined ) {
1134
-
1135
- const vaoKey = this._getVaoKey( attributes );
1136
-
1137
- vaoGPU = this.vaoCache[ vaoKey ];
1138
-
1139
- if ( vaoGPU === undefined ) {
1158
+ const index = renderObject.getIndex();
1140
1159
 
1141
- vaoGPU = this._createVao( attributes );
1160
+ const vaoGPU = this.vertexArrayUtils.getVAO( renderObject, renderObject.getAttributes(), index );
1142
1161
 
1143
- this.vaoCache[ vaoKey ] = vaoGPU;
1144
- attributesData.vaoGPU = vaoGPU;
1162
+ state.setVertexState( vaoGPU );
1145
1163
 
1146
- }
1164
+ //
1147
1165
 
1148
- }
1166
+ if ( context.occlusionQueryCount > 0 ) {
1149
1167
 
1150
- const index = renderObject.getIndex();
1151
- const indexGPU = ( index !== null ) ? this.get( index ).bufferGPU : null;
1168
+ const occlusionData = this.getOcclusionData( context );
1152
1169
 
1153
- state.setVertexState( vaoGPU, indexGPU );
1170
+ const lastObject = occlusionData.lastOcclusionObject;
1154
1171
 
1155
- //
1172
+ if ( lastObject !== object ) {
1156
1173
 
1157
- const lastObject = contextData.lastOcclusionObject;
1174
+ if ( lastObject !== null && lastObject.occlusionTest === true ) {
1158
1175
 
1159
- if ( lastObject !== object && lastObject !== undefined ) {
1176
+ gl.endQuery( gl.ANY_SAMPLES_PASSED );
1160
1177
 
1161
- if ( lastObject !== null && lastObject.occlusionTest === true ) {
1178
+ occlusionData.occlusionQueryIndex ++;
1162
1179
 
1163
- gl.endQuery( gl.ANY_SAMPLES_PASSED );
1180
+ }
1164
1181
 
1165
- contextData.occlusionQueryIndex ++;
1182
+ if ( object.occlusionTest === true ) {
1166
1183
 
1167
- }
1184
+ const query = gl.createQuery();
1168
1185
 
1169
- if ( object.occlusionTest === true ) {
1186
+ gl.beginQuery( gl.ANY_SAMPLES_PASSED, query );
1170
1187
 
1171
- const query = gl.createQuery();
1188
+ occlusionData.occlusionQueries[ occlusionData.occlusionQueryIndex ] = query;
1189
+ occlusionData.occlusionQueryObjects[ occlusionData.occlusionQueryIndex ] = object;
1172
1190
 
1173
- gl.beginQuery( gl.ANY_SAMPLES_PASSED, query );
1191
+ }
1174
1192
 
1175
- contextData.occlusionQueries[ contextData.occlusionQueryIndex ] = query;
1176
- contextData.occlusionQueryObjects[ contextData.occlusionQueryIndex ] = object;
1193
+ occlusionData.lastOcclusionObject = object;
1177
1194
 
1178
1195
  }
1179
1196
 
1180
- contextData.lastOcclusionObject = object;
1181
-
1182
1197
  }
1183
1198
 
1184
1199
  //
@@ -1276,7 +1291,7 @@ class WebGLBackend extends Backend {
1276
1291
  if ( isRenderCameraDepthArray ) {
1277
1292
 
1278
1293
  // Clear the depth texture
1279
- const textureData = this.get( renderTarget.depthTexture );
1294
+ const textureData = this.get( this._currentContext.depthTexture );
1280
1295
 
1281
1296
  if ( textureData.clearedRenderId !== this.renderer._nodes.nodeFrame.renderId ) {
1282
1297
 
@@ -1301,11 +1316,13 @@ class WebGLBackend extends Backend {
1301
1316
 
1302
1317
  }
1303
1318
 
1319
+ const frustumArray = context.frustumArray;
1320
+
1304
1321
  for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1305
1322
 
1306
1323
  const subCamera = cameras[ i ];
1307
1324
 
1308
- if ( object.layers.test( subCamera.layers ) ) {
1325
+ if ( object.layers.test( subCamera.layers ) && ( renderObject.camera.perCameraFrustumCulled === false || object.frustumCulled === false || object.intersectsFrustum( frustumArray.getFrustum( i ) ) ) ) {
1309
1326
 
1310
1327
  if ( isRenderCameraDepthArray ) {
1311
1328
 
@@ -1355,7 +1372,20 @@ class WebGLBackend extends Backend {
1355
1372
  }
1356
1373
 
1357
1374
  /**
1358
- * Explain why always null is returned.
1375
+ * Releases the VAO of the given render object.
1376
+ *
1377
+ * @param {RenderObject} renderObject - The render object.
1378
+ */
1379
+ deleteVertexState( renderObject ) {
1380
+
1381
+ this.vertexArrayUtils.releaseVAO( renderObject );
1382
+
1383
+ }
1384
+
1385
+ /**
1386
+ * Always returns `false` since WebGL has no pipeline state objects. Render state
1387
+ * like blending, depth/stencil or the vertex layout is set per draw, so a render
1388
+ * pipeline only represents a linked shader program which never needs an update.
1359
1389
  *
1360
1390
  * @param {RenderObject} renderObject - The render object.
1361
1391
  * @return {boolean} Whether the render pipeline requires an update or not.
@@ -1367,7 +1397,9 @@ class WebGLBackend extends Backend {
1367
1397
  }
1368
1398
 
1369
1399
  /**
1370
- * Explain why no cache key is computed.
1400
+ * Returns an empty string since a render pipeline only represents a linked shader
1401
+ * program in WebGL. The program is fully identified by its shader stages, which are
1402
+ * already part of the pipeline cache key.
1371
1403
  *
1372
1404
  * @param {RenderObject} renderObject - The render object.
1373
1405
  * @return {string} The cache key.
@@ -1514,6 +1546,11 @@ class WebGLBackend extends Backend {
1514
1546
  */
1515
1547
  destroyProgram( program ) {
1516
1548
 
1549
+ const gl = this.gl;
1550
+ const data = this.get( program );
1551
+
1552
+ gl.deleteShader( data.shaderGPU );
1553
+
1517
1554
  this.delete( program );
1518
1555
 
1519
1556
  }
@@ -1582,6 +1619,30 @@ class WebGLBackend extends Backend {
1582
1619
 
1583
1620
  }
1584
1621
 
1622
+ /**
1623
+ * Destroys the given pipeline.
1624
+ *
1625
+ * @param {Pipeline} pipeline - The pipeline.
1626
+ */
1627
+ destroyPipeline( pipeline ) {
1628
+
1629
+ const gl = this.gl;
1630
+ const data = this.get( pipeline );
1631
+
1632
+ if ( pipeline.isComputePipeline === true ) {
1633
+
1634
+ // Compute pipeline manage their own VAOs (without render objects)
1635
+
1636
+ this.vertexArrayUtils.releaseVAO( pipeline );
1637
+
1638
+ }
1639
+
1640
+ gl.deleteProgram( data.programGPU );
1641
+
1642
+ this.delete( pipeline );
1643
+
1644
+ }
1645
+
1585
1646
  /**
1586
1647
  * Formats the source code of error messages.
1587
1648
  *
@@ -1754,7 +1815,7 @@ class WebGLBackend extends Backend {
1754
1815
  const fragmentShader = this.get( fragmentProgram ).shaderGPU;
1755
1816
  const vertexShader = this.get( computeProgram ).shaderGPU;
1756
1817
 
1757
- const transforms = computeProgram.transforms;
1818
+ const transforms = computePipeline.transforms;
1758
1819
 
1759
1820
  const transformVaryingNames = [];
1760
1821
  const transformAttributeNodes = [];
@@ -1779,29 +1840,21 @@ class WebGLBackend extends Backend {
1779
1840
 
1780
1841
  gl.linkProgram( programGPU );
1781
1842
 
1782
- const attributeNodes = computeProgram.attributes;
1843
+ // only the attributes are stored since their buffers are re-created when they are disposed (see compute())
1844
+
1845
+ const attributeNodes = computePipeline.attributes;
1783
1846
  const attributes = [];
1784
- const transformBuffers = [];
1847
+ const transformAttributes = [];
1785
1848
 
1786
1849
  for ( let i = 0; i < attributeNodes.length; i ++ ) {
1787
1850
 
1788
- const attribute = attributeNodes[ i ].node.attribute;
1789
-
1790
- attributes.push( attribute );
1791
-
1792
- if ( ! this.has( attribute ) ) this.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );
1851
+ attributes.push( attributeNodes[ i ].node.attribute );
1793
1852
 
1794
1853
  }
1795
1854
 
1796
1855
  for ( let i = 0; i < transformAttributeNodes.length; i ++ ) {
1797
1856
 
1798
- const attribute = transformAttributeNodes[ i ].attribute;
1799
-
1800
- if ( ! this.has( attribute ) ) this.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );
1801
-
1802
- const attributeData = this.get( attribute );
1803
-
1804
- transformBuffers.push( attributeData );
1857
+ transformAttributes.push( transformAttributeNodes[ i ].attribute );
1805
1858
 
1806
1859
  }
1807
1860
 
@@ -1811,7 +1864,7 @@ class WebGLBackend extends Backend {
1811
1864
  programGPU,
1812
1865
  fragmentShader,
1813
1866
  vertexShader,
1814
- transformBuffers,
1867
+ transformAttributes,
1815
1868
  attributes
1816
1869
  } );
1817
1870
 
@@ -2149,6 +2202,10 @@ class WebGLBackend extends Backend {
2149
2202
  */
2150
2203
  destroyAttribute( attribute ) {
2151
2204
 
2205
+ // VAOs keep the memory of attached buffers allocated
2206
+
2207
+ this.vertexArrayUtils.releaseBuffer( this.get( this.getBufferAttribute( attribute ) ) );
2208
+
2152
2209
  this.attributeUtils.destroyAttribute( attribute );
2153
2210
 
2154
2211
  }
@@ -2252,8 +2309,6 @@ class WebGLBackend extends Backend {
2252
2309
  const { depthBuffer, stencilBuffer } = renderTarget;
2253
2310
 
2254
2311
  const isCube = renderTarget.isCubeRenderTarget === true;
2255
- const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
2256
- const isRenderTargetArray = renderTarget.depth > 1;
2257
2312
  const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
2258
2313
  const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );
2259
2314
 
@@ -2313,8 +2368,8 @@ class WebGLBackend extends Backend {
2313
2368
 
2314
2369
  const { textureGPU } = this.get( textures[ 0 ] );
2315
2370
 
2316
- const cubeFace = this.renderer._activeCubeFace;
2317
- const mipLevel = this.renderer._activeMipmapLevel;
2371
+ const cubeFace = descriptor.activeCubeFace;
2372
+ const mipLevel = descriptor.activeMipmapLevel;
2318
2373
 
2319
2374
  gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );
2320
2375
 
@@ -2326,8 +2381,6 @@ class WebGLBackend extends Backend {
2326
2381
 
2327
2382
  const texture = textures[ i ];
2328
2383
  const textureData = this.get( texture );
2329
- textureData.renderTarget = descriptor.renderTarget;
2330
- textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
2331
2384
 
2332
2385
  const attachment = gl.COLOR_ATTACHMENT0 + i;
2333
2386
 
@@ -2335,10 +2388,10 @@ class WebGLBackend extends Backend {
2335
2388
 
2336
2389
  multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, samples, 0, 2 );
2337
2390
 
2338
- } else if ( isRenderTarget3D || isRenderTargetArray ) {
2391
+ } else if ( textureData.glTextureType === gl.TEXTURE_2D_ARRAY || textureData.glTextureType === gl.TEXTURE_3D ) {
2339
2392
 
2340
- const layer = this.renderer._activeCubeFace;
2341
- const mipLevel = this.renderer._activeMipmapLevel;
2393
+ const layer = descriptor.activeCubeFace;
2394
+ const mipLevel = descriptor.activeMipmapLevel;
2342
2395
 
2343
2396
  gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );
2344
2397
 
@@ -2350,7 +2403,7 @@ class WebGLBackend extends Backend {
2350
2403
 
2351
2404
  } else {
2352
2405
 
2353
- const mipLevel = this.renderer._activeMipmapLevel;
2406
+ const mipLevel = descriptor.activeMipmapLevel;
2354
2407
 
2355
2408
  gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );
2356
2409
 
@@ -2382,8 +2435,6 @@ class WebGLBackend extends Backend {
2382
2435
  depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
2383
2436
 
2384
2437
  const textureData = this.get( descriptor.depthTexture );
2385
- textureData.renderTarget = descriptor.renderTarget;
2386
- textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
2387
2438
 
2388
2439
  if ( renderTarget.multiview ) {
2389
2440
 
@@ -2397,13 +2448,13 @@ class WebGLBackend extends Backend {
2397
2448
 
2398
2449
  if ( descriptor.depthTexture.isArrayTexture ) {
2399
2450
 
2400
- const layer = this.renderer._activeCubeFace;
2451
+ const layer = descriptor.activeCubeFace;
2401
2452
 
2402
2453
  gl.framebufferTextureLayer( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, layer );
2403
2454
 
2404
2455
  } else if ( descriptor.depthTexture.isCubeTexture ) {
2405
2456
 
2406
- const cubeFace = this.renderer._activeCubeFace;
2457
+ const cubeFace = descriptor.activeCubeFace;
2407
2458
 
2408
2459
  gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureData.textureGPU, 0 );
2409
2460
 
@@ -2430,7 +2481,7 @@ class WebGLBackend extends Backend {
2430
2481
 
2431
2482
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
2432
2483
 
2433
- const layer = this.renderer._activeCubeFace;
2484
+ const layer = descriptor.activeCubeFace;
2434
2485
 
2435
2486
  const depthData = this.get( descriptor.depthTexture );
2436
2487
  const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
@@ -2452,19 +2503,23 @@ class WebGLBackend extends Backend {
2452
2503
 
2453
2504
  // rebind color
2454
2505
 
2455
- const textureData = this.get( descriptor.textures[ 0 ] );
2506
+ if ( descriptor.textures.length > 0 ) {
2507
+
2508
+ const textureData = this.get( descriptor.textures[ 0 ] );
2456
2509
 
2457
- if ( renderTarget.multiview ) {
2510
+ if ( renderTarget.multiview ) {
2458
2511
 
2459
- multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureData.textureGPU, 0, samples, 0, 2 );
2512
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureData.textureGPU, 0, samples, 0, 2 );
2460
2513
 
2461
- } else if ( useMultisampledRTT ) {
2514
+ } else if ( useMultisampledRTT ) {
2462
2515
 
2463
- multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2516
+ multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2464
2517
 
2465
- } else {
2518
+ } else {
2519
+
2520
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2466
2521
 
2467
- gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2522
+ }
2468
2523
 
2469
2524
  }
2470
2525
 
@@ -2561,141 +2616,6 @@ class WebGLBackend extends Backend {
2561
2616
 
2562
2617
  }
2563
2618
 
2564
- /**
2565
- * Computes the VAO key for the given index and attributes.
2566
- *
2567
- * @private
2568
- * @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
2569
- * @return {string} The VAO key.
2570
- */
2571
- _getVaoKey( attributes ) {
2572
-
2573
- let key = '';
2574
-
2575
- for ( let i = 0; i < attributes.length; i ++ ) {
2576
-
2577
- const attributeData = this.get( attributes[ i ] );
2578
-
2579
- key += ':' + attributeData.id;
2580
-
2581
- }
2582
-
2583
- return key;
2584
-
2585
- }
2586
-
2587
- /**
2588
- * Creates a VAO from the index and attributes.
2589
- *
2590
- * @private
2591
- * @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
2592
- * @return {Object} The VAO data.
2593
- */
2594
- _createVao( attributes ) {
2595
-
2596
- const { gl } = this;
2597
-
2598
- const vaoGPU = gl.createVertexArray();
2599
-
2600
- gl.bindVertexArray( vaoGPU );
2601
-
2602
- for ( let i = 0; i < attributes.length; i ++ ) {
2603
-
2604
- const attribute = attributes[ i ];
2605
- const attributeData = this.get( attribute );
2606
-
2607
- gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
2608
- gl.enableVertexAttribArray( i );
2609
-
2610
- let stride, offset;
2611
-
2612
- if ( attribute.isInterleavedBufferAttribute === true ) {
2613
-
2614
- stride = attribute.data.stride * attributeData.bytesPerElement;
2615
- offset = attribute.offset * attributeData.bytesPerElement;
2616
-
2617
- } else {
2618
-
2619
- stride = 0;
2620
- offset = 0;
2621
-
2622
- }
2623
-
2624
- if ( attributeData.isInteger ) {
2625
-
2626
- gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
2627
-
2628
- } else {
2629
-
2630
- gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, attribute.normalized, stride, offset );
2631
-
2632
- }
2633
-
2634
- if ( attribute.isInstancedBufferAttribute && ! attribute.isInterleavedBufferAttribute ) {
2635
-
2636
- gl.vertexAttribDivisor( i, attribute.meshPerAttribute );
2637
-
2638
- } else if ( attribute.isInterleavedBufferAttribute && attribute.data.isInstancedInterleavedBuffer ) {
2639
-
2640
- gl.vertexAttribDivisor( i, attribute.data.meshPerAttribute );
2641
-
2642
- }
2643
-
2644
- }
2645
-
2646
- gl.bindBuffer( gl.ARRAY_BUFFER, null );
2647
-
2648
- return vaoGPU;
2649
-
2650
- }
2651
-
2652
- /**
2653
- * Creates a transform feedback from the given transform buffers.
2654
- *
2655
- * @private
2656
- * @param {Array<DualAttributeData>} transformBuffers - The transform buffers.
2657
- * @return {WebGLTransformFeedback} The transform feedback.
2658
- */
2659
- _getTransformFeedback( transformBuffers ) {
2660
-
2661
- let key = '';
2662
-
2663
- for ( let i = 0; i < transformBuffers.length; i ++ ) {
2664
-
2665
- key += ':' + transformBuffers[ i ].id;
2666
-
2667
- }
2668
-
2669
- let transformFeedbackGPU = this.transformFeedbackCache[ key ];
2670
-
2671
- if ( transformFeedbackGPU !== undefined ) {
2672
-
2673
- return transformFeedbackGPU;
2674
-
2675
- }
2676
-
2677
- const { gl } = this;
2678
-
2679
- transformFeedbackGPU = gl.createTransformFeedback();
2680
-
2681
- gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
2682
-
2683
- for ( let i = 0; i < transformBuffers.length; i ++ ) {
2684
-
2685
- const attributeData = transformBuffers[ i ];
2686
-
2687
- gl.bindBufferBase( gl.TRANSFORM_FEEDBACK_BUFFER, i, attributeData.transformBuffer );
2688
-
2689
- }
2690
-
2691
- gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, null );
2692
-
2693
- this.transformFeedbackCache[ key ] = transformFeedbackGPU;
2694
-
2695
- return transformFeedbackGPU;
2696
-
2697
- }
2698
-
2699
2619
  /**
2700
2620
  * Setups the given bindings.
2701
2621
  *
@@ -2791,8 +2711,9 @@ class WebGLBackend extends Backend {
2791
2711
  if ( renderTarget.samples > 0 && renderTargetContextData.msaaFrameBuffer !== undefined && this._useMultisampledExtension( renderTarget ) === false ) {
2792
2712
 
2793
2713
  const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
2714
+ const textures = renderContext.textures;
2794
2715
 
2795
- let mask = renderTarget.resolveColorBuffer === false ? 0 : gl.COLOR_BUFFER_BIT;
2716
+ let mask = renderTarget.resolveColorBuffer === false || textures.length === 0 ? 0 : gl.COLOR_BUFFER_BIT;
2796
2717
 
2797
2718
  if ( renderTarget.resolveDepthBuffer ) {
2798
2719
 
@@ -2804,9 +2725,11 @@ class WebGLBackend extends Backend {
2804
2725
  const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
2805
2726
  const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
2806
2727
 
2807
- const textures = renderContext.textures;
2808
2728
  const isMRT = textures.length > 1;
2809
2729
 
2730
+ // Depth-only render targets have no color attachment but still resolve their depth.
2731
+ const blitCount = Math.max( textures.length, 1 );
2732
+
2810
2733
  state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
2811
2734
  state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
2812
2735
 
@@ -2824,7 +2747,7 @@ class WebGLBackend extends Backend {
2824
2747
 
2825
2748
  }
2826
2749
 
2827
- for ( let i = 0; i < textures.length; i ++ ) {
2750
+ for ( let i = 0; i < blitCount; i ++ ) {
2828
2751
 
2829
2752
  if ( isMRT ) {
2830
2753
 
@@ -2936,10 +2859,15 @@ class WebGLBackend extends Backend {
2936
2859
 
2937
2860
  await super.dispose();
2938
2861
 
2862
+ if ( this.vertexArrayUtils !== null ) this.vertexArrayUtils.dispose();
2939
2863
  if ( this.textureUtils !== null ) this.textureUtils.dispose();
2940
2864
 
2941
- const extension = this.extensions.get( 'WEBGL_lose_context' );
2942
- if ( extension ) extension.loseContext();
2865
+ if ( this.parameters.canvas === undefined ) {
2866
+
2867
+ const extension = this.extensions.get( 'WEBGL_lose_context' );
2868
+ if ( extension ) extension.loseContext();
2869
+
2870
+ }
2943
2871
 
2944
2872
  this.renderer.domElement.removeEventListener( 'webglcontextlost', this._onContextLost );
2945
2873