super-three 0.179.0 → 0.184.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 (696) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +14522 -12207
  4. package/build/three.core.js +12005 -10954
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +2270 -1005
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +63 -18
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +16573 -7890
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +16533 -7888
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  15. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  16. package/examples/jsm/Addons.js +12 -4
  17. package/examples/jsm/animation/CCDIKSolver.js +8 -4
  18. package/examples/jsm/controls/ArcballControls.js +15 -12
  19. package/examples/jsm/controls/DragControls.js +9 -59
  20. package/examples/jsm/controls/FirstPersonControls.js +61 -57
  21. package/examples/jsm/controls/FlyControls.js +5 -1
  22. package/examples/jsm/controls/MapControls.js +55 -1
  23. package/examples/jsm/controls/OrbitControls.js +113 -10
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +9 -9
  26. package/examples/jsm/controls/TransformControls.js +35 -3
  27. package/examples/jsm/csm/CSM.js +2 -1
  28. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  29. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  30. package/examples/jsm/effects/AsciiEffect.js +8 -8
  31. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  32. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  33. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  34. package/examples/jsm/exporters/EXRExporter.js +2 -2
  35. package/examples/jsm/exporters/GLTFExporter.js +185 -34
  36. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  37. package/examples/jsm/exporters/PLYExporter.js +1 -1
  38. package/examples/jsm/exporters/USDZExporter.js +31 -5
  39. package/examples/jsm/geometries/DecalGeometry.js +3 -3
  40. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  41. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  42. package/examples/jsm/geometries/TextGeometry.js +21 -2
  43. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  44. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  45. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  46. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  47. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  48. package/examples/jsm/helpers/ViewHelper.js +110 -13
  49. package/examples/jsm/inspector/Extension.js +13 -0
  50. package/examples/jsm/inspector/Inspector.js +542 -0
  51. package/examples/jsm/inspector/RendererInspector.js +425 -0
  52. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  53. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  55. package/examples/jsm/inspector/tabs/Console.js +238 -0
  56. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  57. package/examples/jsm/inspector/tabs/Parameters.js +380 -0
  58. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  59. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  60. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  61. package/examples/jsm/inspector/tabs/Viewer.js +268 -0
  62. package/examples/jsm/inspector/ui/Graph.js +95 -0
  63. package/examples/jsm/inspector/ui/Item.js +170 -0
  64. package/examples/jsm/inspector/ui/List.js +75 -0
  65. package/examples/jsm/inspector/ui/Profiler.js +2072 -0
  66. package/examples/jsm/inspector/ui/Style.js +1667 -0
  67. package/examples/jsm/inspector/ui/Tab.js +265 -0
  68. package/examples/jsm/inspector/ui/Values.js +476 -0
  69. package/examples/jsm/inspector/ui/utils.js +69 -0
  70. package/examples/jsm/interaction/InteractionManager.js +226 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  73. package/examples/jsm/interactive/SelectionBox.js +30 -0
  74. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  75. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  76. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  77. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  79. package/examples/jsm/lines/Line2.js +3 -3
  80. package/examples/jsm/lines/LineGeometry.js +1 -1
  81. package/examples/jsm/lines/LineMaterial.js +7 -1
  82. package/examples/jsm/lines/LineSegments2.js +2 -2
  83. package/examples/jsm/lines/Wireframe.js +2 -2
  84. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  85. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  86. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  87. package/examples/jsm/loaders/3DMLoader.js +5 -4
  88. package/examples/jsm/loaders/3MFLoader.js +3 -3
  89. package/examples/jsm/loaders/AMFLoader.js +2 -2
  90. package/examples/jsm/loaders/ColladaLoader.js +27 -4029
  91. package/examples/jsm/loaders/DDSLoader.js +1 -1
  92. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  93. package/examples/jsm/loaders/EXRLoader.js +692 -53
  94. package/examples/jsm/loaders/FBXLoader.js +237 -39
  95. package/examples/jsm/loaders/FontLoader.js +23 -5
  96. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  97. package/examples/jsm/loaders/GLTFLoader.js +159 -185
  98. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  99. package/examples/jsm/loaders/HDRLoader.js +485 -0
  100. package/examples/jsm/loaders/KMZLoader.js +5 -5
  101. package/examples/jsm/loaders/KTX2Loader.js +162 -53
  102. package/examples/jsm/loaders/KTXLoader.js +2 -2
  103. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  104. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  105. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  106. package/examples/jsm/loaders/LWOLoader.js +9 -41
  107. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  108. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  109. package/examples/jsm/loaders/OBJLoader.js +1 -1
  110. package/examples/jsm/loaders/PCDLoader.js +4 -2
  111. package/examples/jsm/loaders/PDBLoader.js +1 -1
  112. package/examples/jsm/loaders/RGBELoader.js +7 -473
  113. package/examples/jsm/loaders/SVGLoader.js +4 -4
  114. package/examples/jsm/loaders/TDSLoader.js +0 -2
  115. package/examples/jsm/loaders/TGALoader.js +0 -2
  116. package/examples/jsm/loaders/TTFLoader.js +4 -4
  117. package/examples/jsm/loaders/USDLoader.js +100 -40
  118. package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
  119. package/examples/jsm/loaders/VOXLoader.js +660 -117
  120. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  121. package/examples/jsm/loaders/VTKLoader.js +42 -25
  122. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  123. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  124. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  125. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  126. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  127. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  128. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  129. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  130. package/examples/jsm/math/ColorSpaces.js +19 -1
  131. package/examples/jsm/math/ConvexHull.js +3 -3
  132. package/examples/jsm/math/ImprovedNoise.js +1 -1
  133. package/examples/jsm/math/Lut.js +2 -2
  134. package/examples/jsm/math/Octree.js +131 -1
  135. package/examples/jsm/math/SimplexNoise.js +1 -1
  136. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  137. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  138. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  139. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  140. package/examples/jsm/misc/RollerCoaster.js +42 -4
  141. package/examples/jsm/misc/TubePainter.js +383 -40
  142. package/examples/jsm/misc/Volume.js +1 -2
  143. package/examples/jsm/misc/VolumeSlice.js +0 -1
  144. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  145. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  146. package/examples/jsm/objects/LensflareMesh.js +1 -1
  147. package/examples/jsm/objects/Reflector.js +73 -25
  148. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  149. package/examples/jsm/objects/Sky.js +91 -7
  150. package/examples/jsm/objects/SkyMesh.js +151 -17
  151. package/examples/jsm/objects/Water.js +7 -6
  152. package/examples/jsm/objects/Water2.js +5 -3
  153. package/examples/jsm/objects/WaterMesh.js +11 -13
  154. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  155. package/examples/jsm/physics/JoltPhysics.js +10 -6
  156. package/examples/jsm/physics/RapierPhysics.js +9 -5
  157. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  158. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  159. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  160. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  161. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  162. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  163. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  164. package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
  165. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  166. package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
  167. package/examples/jsm/renderers/Projector.js +246 -28
  168. package/examples/jsm/renderers/SVGRenderer.js +175 -61
  169. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  170. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  171. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  172. package/examples/jsm/shaders/BokehShader.js +1 -1
  173. package/examples/jsm/shaders/BokehShader2.js +1 -1
  174. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  175. package/examples/jsm/shaders/FocusShader.js +1 -1
  176. package/examples/jsm/shaders/GTAOShader.js +21 -8
  177. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  178. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  179. package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
  180. package/examples/jsm/shaders/SAOShader.js +17 -4
  181. package/examples/jsm/shaders/SSAOShader.js +11 -1
  182. package/examples/jsm/shaders/SSRShader.js +7 -6
  183. package/examples/jsm/shaders/SepiaShader.js +1 -1
  184. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  185. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  186. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +3 -5
  187. package/examples/jsm/shaders/VignetteShader.js +1 -1
  188. package/examples/jsm/transpiler/AST.js +44 -0
  189. package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
  190. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  191. package/examples/jsm/transpiler/TSLEncoder.js +52 -10
  192. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  193. package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
  194. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  195. package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
  196. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  197. package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
  198. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  199. package/examples/jsm/tsl/display/BloomNode.js +23 -9
  200. package/examples/jsm/tsl/display/CRT.js +150 -0
  201. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
  202. package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
  203. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  204. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  205. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  206. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  207. package/examples/jsm/tsl/display/GTAONode.js +59 -9
  208. package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
  209. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  210. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  211. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  212. package/examples/jsm/tsl/display/OutlineNode.js +81 -20
  213. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  214. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  215. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  216. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  217. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  218. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  219. package/examples/jsm/tsl/display/SSGINode.js +638 -0
  220. package/examples/jsm/tsl/display/SSRNode.js +186 -69
  221. package/examples/jsm/tsl/display/SSSNode.js +490 -0
  222. package/examples/jsm/tsl/display/Shape.js +29 -0
  223. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  224. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  225. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  226. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  227. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  228. package/examples/jsm/tsl/display/TRAANode.js +381 -75
  229. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  230. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  231. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  232. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  233. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  234. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  235. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  236. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  237. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  238. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  239. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  240. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  241. package/examples/jsm/tsl/math/Bayer.js +53 -3
  242. package/examples/jsm/utils/BufferGeometryUtils.js +3 -4
  243. package/examples/jsm/utils/ColorUtils.js +76 -0
  244. package/examples/jsm/utils/LDrawUtils.js +1 -1
  245. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  246. package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
  247. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  248. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  249. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  250. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  251. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  252. package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
  253. package/package.json +27 -38
  254. package/src/Three.Core.js +7 -3
  255. package/src/Three.TSL.js +61 -16
  256. package/src/Three.WebGPU.Nodes.js +7 -0
  257. package/src/Three.WebGPU.js +11 -0
  258. package/src/Three.js +1 -0
  259. package/src/animation/AnimationAction.js +12 -2
  260. package/src/animation/AnimationClip.js +21 -5
  261. package/src/animation/AnimationMixer.js +9 -3
  262. package/src/animation/AnimationObjectGroup.js +2 -1
  263. package/src/animation/AnimationUtils.js +1 -12
  264. package/src/animation/KeyframeTrack.js +54 -14
  265. package/src/animation/PropertyBinding.js +12 -11
  266. package/src/animation/PropertyMixer.js +4 -4
  267. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  268. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  269. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  270. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  271. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  272. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  273. package/src/audio/Audio.js +11 -10
  274. package/src/audio/AudioContext.js +2 -2
  275. package/src/audio/AudioListener.js +5 -3
  276. package/src/audio/PositionalAudio.js +1 -1
  277. package/src/cameras/Camera.js +32 -2
  278. package/src/cameras/CubeCamera.js +20 -0
  279. package/src/cameras/OrthographicCamera.js +1 -1
  280. package/src/cameras/PerspectiveCamera.js +1 -1
  281. package/src/cameras/StereoCamera.js +2 -2
  282. package/src/constants.js +100 -7
  283. package/src/core/BufferAttribute.js +13 -1
  284. package/src/core/BufferGeometry.js +24 -12
  285. package/src/core/Clock.js +7 -0
  286. package/src/core/EventDispatcher.js +1 -1
  287. package/src/core/InterleavedBuffer.js +1 -1
  288. package/src/core/InterleavedBufferAttribute.js +3 -2
  289. package/src/core/Object3D.js +55 -6
  290. package/src/core/Raycaster.js +4 -3
  291. package/src/core/RenderTarget.js +14 -5
  292. package/src/extras/Controls.js +5 -4
  293. package/src/extras/DataUtils.js +2 -1
  294. package/src/extras/Earcut.js +6 -0
  295. package/src/extras/ImageUtils.js +2 -2
  296. package/src/extras/PMREMGenerator.js +259 -57
  297. package/src/extras/TextureUtils.js +6 -1
  298. package/src/extras/core/Curve.js +2 -1
  299. package/src/extras/core/Interpolations.js +7 -1
  300. package/src/extras/core/ShapePath.js +4 -4
  301. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  302. package/src/extras/lib/earcut.js +8 -8
  303. package/src/geometries/BoxGeometry.js +1 -0
  304. package/src/geometries/CapsuleGeometry.js +1 -0
  305. package/src/geometries/CircleGeometry.js +1 -0
  306. package/src/geometries/ConeGeometry.js +1 -0
  307. package/src/geometries/CylinderGeometry.js +1 -0
  308. package/src/geometries/DodecahedronGeometry.js +1 -0
  309. package/src/geometries/ExtrudeGeometry.js +10 -8
  310. package/src/geometries/IcosahedronGeometry.js +1 -0
  311. package/src/geometries/LatheGeometry.js +1 -0
  312. package/src/geometries/OctahedronGeometry.js +1 -0
  313. package/src/geometries/PlaneGeometry.js +1 -0
  314. package/src/geometries/PolyhedronGeometry.js +1 -1
  315. package/src/geometries/RingGeometry.js +1 -0
  316. package/src/geometries/ShapeGeometry.js +1 -0
  317. package/src/geometries/SphereGeometry.js +1 -0
  318. package/src/geometries/TetrahedronGeometry.js +1 -0
  319. package/src/geometries/TorusGeometry.js +9 -3
  320. package/src/geometries/TorusKnotGeometry.js +1 -0
  321. package/src/geometries/TubeGeometry.js +1 -0
  322. package/src/helpers/CameraHelper.js +4 -1
  323. package/src/helpers/DirectionalLightHelper.js +4 -1
  324. package/src/helpers/HemisphereLightHelper.js +3 -0
  325. package/src/helpers/PointLightHelper.js +1 -25
  326. package/src/helpers/SpotLightHelper.js +3 -0
  327. package/src/lights/DirectionalLight.js +13 -0
  328. package/src/lights/HemisphereLight.js +10 -0
  329. package/src/lights/Light.js +1 -11
  330. package/src/lights/LightProbe.js +0 -15
  331. package/src/lights/LightShadow.js +15 -6
  332. package/src/lights/PointLight.js +15 -0
  333. package/src/lights/PointLightShadow.js +0 -86
  334. package/src/lights/SpotLight.js +22 -1
  335. package/src/lights/webgpu/IESSpotLight.js +2 -1
  336. package/src/lights/webgpu/ProjectorLight.js +1 -1
  337. package/src/loaders/AnimationLoader.js +2 -1
  338. package/src/loaders/AudioLoader.js +13 -2
  339. package/src/loaders/BufferGeometryLoader.js +2 -2
  340. package/src/loaders/Cache.js +30 -2
  341. package/src/loaders/DataTextureLoader.js +6 -4
  342. package/src/loaders/FileLoader.js +4 -4
  343. package/src/loaders/ImageBitmapLoader.js +17 -13
  344. package/src/loaders/ImageLoader.js +1 -1
  345. package/src/loaders/Loader.js +9 -3
  346. package/src/loaders/LoadingManager.js +25 -3
  347. package/src/loaders/MaterialLoader.js +6 -4
  348. package/src/loaders/ObjectLoader.js +57 -17
  349. package/src/loaders/TextureLoader.js +1 -1
  350. package/src/loaders/nodes/NodeLoader.js +5 -4
  351. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  352. package/src/materials/Material.js +18 -3
  353. package/src/materials/MeshBasicMaterial.js +1 -0
  354. package/src/materials/MeshDepthMaterial.js +1 -0
  355. package/src/materials/MeshDistanceMaterial.js +1 -1
  356. package/src/materials/MeshLambertMaterial.js +11 -1
  357. package/src/materials/MeshMatcapMaterial.js +22 -0
  358. package/src/materials/MeshNormalMaterial.js +1 -0
  359. package/src/materials/MeshPhongMaterial.js +11 -1
  360. package/src/materials/MeshPhysicalMaterial.js +2 -1
  361. package/src/materials/MeshStandardMaterial.js +8 -7
  362. package/src/materials/MeshToonMaterial.js +2 -1
  363. package/src/materials/PointsMaterial.js +1 -1
  364. package/src/materials/ShaderMaterial.js +22 -3
  365. package/src/materials/nodes/Line2NodeMaterial.js +36 -9
  366. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  367. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  368. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  369. package/src/materials/nodes/NodeMaterial.js +95 -35
  370. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  371. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  372. package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
  373. package/src/math/Color.js +6 -5
  374. package/src/math/ColorManagement.js +9 -3
  375. package/src/math/Cylindrical.js +1 -1
  376. package/src/math/Euler.js +2 -1
  377. package/src/math/Line3.js +6 -5
  378. package/src/math/MathUtils.js +23 -21
  379. package/src/math/Matrix2.js +14 -10
  380. package/src/math/Matrix3.js +15 -11
  381. package/src/math/Matrix4.js +94 -81
  382. package/src/math/Plane.js +5 -4
  383. package/src/math/Quaternion.js +60 -84
  384. package/src/math/Sphere.js +1 -1
  385. package/src/math/Spherical.js +1 -1
  386. package/src/math/Triangle.js +1 -1
  387. package/src/math/Vector2.js +11 -7
  388. package/src/math/Vector3.js +15 -13
  389. package/src/math/Vector4.js +13 -9
  390. package/src/math/interpolants/BezierInterpolant.js +108 -0
  391. package/src/nodes/Nodes.js +86 -65
  392. package/src/nodes/TSL.js +11 -8
  393. package/src/nodes/accessors/Arrays.js +1 -1
  394. package/src/nodes/accessors/BatchNode.js +10 -10
  395. package/src/nodes/accessors/Bitangent.js +5 -5
  396. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  397. package/src/nodes/accessors/BufferNode.js +30 -3
  398. package/src/nodes/accessors/Camera.js +260 -13
  399. package/src/nodes/accessors/ClippingNode.js +10 -9
  400. package/src/nodes/accessors/CubeTextureNode.js +32 -6
  401. package/src/nodes/accessors/InstanceNode.js +164 -39
  402. package/src/nodes/accessors/Lights.js +10 -0
  403. package/src/nodes/accessors/MaterialNode.js +9 -1
  404. package/src/nodes/accessors/MaterialProperties.js +2 -5
  405. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  406. package/src/nodes/accessors/ModelNode.js +1 -1
  407. package/src/nodes/accessors/Normal.js +16 -15
  408. package/src/nodes/accessors/Object3DNode.js +2 -2
  409. package/src/nodes/accessors/Position.js +51 -3
  410. package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
  411. package/src/nodes/accessors/ReferenceNode.js +11 -10
  412. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  413. package/src/nodes/accessors/SceneProperties.js +47 -0
  414. package/src/nodes/accessors/SkinningNode.js +27 -26
  415. package/src/nodes/accessors/StorageBufferNode.js +14 -24
  416. package/src/nodes/accessors/StorageTextureNode.js +62 -9
  417. package/src/nodes/accessors/Tangent.js +4 -14
  418. package/src/nodes/accessors/Texture3DNode.js +41 -31
  419. package/src/nodes/accessors/TextureNode.js +193 -63
  420. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  421. package/src/nodes/accessors/UserDataNode.js +1 -2
  422. package/src/nodes/accessors/VertexColorNode.js +1 -2
  423. package/src/nodes/code/FunctionCallNode.js +25 -5
  424. package/src/nodes/code/FunctionNode.js +25 -3
  425. package/src/nodes/core/ArrayNode.js +22 -2
  426. package/src/nodes/core/AssignNode.js +6 -5
  427. package/src/nodes/core/AttributeNode.js +5 -4
  428. package/src/nodes/core/BypassNode.js +1 -1
  429. package/src/nodes/core/ContextNode.js +133 -15
  430. package/src/nodes/core/IndexNode.js +4 -3
  431. package/src/nodes/core/InputNode.js +3 -2
  432. package/src/nodes/core/InspectorNode.js +128 -0
  433. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
  434. package/src/nodes/core/MRTNode.js +48 -2
  435. package/src/nodes/core/Node.js +264 -46
  436. package/src/nodes/core/NodeBuilder.js +453 -87
  437. package/src/nodes/core/NodeError.js +28 -0
  438. package/src/nodes/core/NodeFrame.js +31 -23
  439. package/src/nodes/core/NodeFunction.js +2 -1
  440. package/src/nodes/core/NodeParser.js +2 -1
  441. package/src/nodes/core/NodeUniform.js +1 -1
  442. package/src/nodes/core/NodeUtils.js +25 -97
  443. package/src/nodes/core/OutputStructNode.js +12 -10
  444. package/src/nodes/core/ParameterNode.js +34 -3
  445. package/src/nodes/core/PropertyNode.js +26 -3
  446. package/src/nodes/core/StackNode.js +99 -23
  447. package/src/nodes/core/StackTrace.js +139 -0
  448. package/src/nodes/core/StructNode.js +22 -8
  449. package/src/nodes/core/StructTypeNode.js +13 -18
  450. package/src/nodes/core/SubBuildNode.js +4 -4
  451. package/src/nodes/core/UniformGroupNode.js +36 -6
  452. package/src/nodes/core/UniformNode.js +37 -13
  453. package/src/nodes/core/VarNode.js +96 -34
  454. package/src/nodes/core/VaryingNode.js +2 -18
  455. package/src/nodes/display/BlendModes.js +0 -63
  456. package/src/nodes/display/BumpMapNode.js +1 -1
  457. package/src/nodes/display/ColorAdjustment.js +18 -1
  458. package/src/nodes/display/ColorSpaceNode.js +3 -3
  459. package/src/nodes/display/FrontFacingNode.js +4 -8
  460. package/src/nodes/display/NormalMapNode.js +41 -5
  461. package/src/nodes/display/PassNode.js +175 -25
  462. package/src/nodes/display/RenderOutputNode.js +35 -9
  463. package/src/nodes/display/ScreenNode.js +47 -15
  464. package/src/nodes/display/ToneMappingNode.js +32 -5
  465. package/src/nodes/display/ToonOutlinePassNode.js +10 -2
  466. package/src/nodes/display/ViewportDepthNode.js +52 -4
  467. package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
  468. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  469. package/src/nodes/display/ViewportTextureNode.js +72 -14
  470. package/src/nodes/fog/Fog.js +18 -34
  471. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  472. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  473. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  474. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  475. package/src/nodes/functions/BasicLightingModel.js +2 -1
  476. package/src/nodes/functions/PhysicalLightingModel.js +128 -46
  477. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  478. package/src/nodes/geometry/RangeNode.js +44 -6
  479. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  480. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  481. package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
  482. package/src/nodes/gpgpu/ComputeNode.js +76 -38
  483. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  484. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
  485. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  486. package/src/nodes/lighting/EnvironmentNode.js +34 -9
  487. package/src/nodes/lighting/LightsNode.js +10 -32
  488. package/src/nodes/lighting/PointShadowNode.js +167 -148
  489. package/src/nodes/lighting/ShadowFilterNode.js +55 -65
  490. package/src/nodes/lighting/ShadowNode.js +189 -44
  491. package/src/nodes/math/BitcastNode.js +156 -0
  492. package/src/nodes/math/BitcountNode.js +433 -0
  493. package/src/nodes/math/ConditionalNode.js +25 -8
  494. package/src/nodes/math/MathNode.js +98 -57
  495. package/src/nodes/math/OperatorNode.js +8 -5
  496. package/src/nodes/math/PackFloatNode.js +98 -0
  497. package/src/nodes/math/UnpackFloatNode.js +96 -0
  498. package/src/nodes/pmrem/PMREMNode.js +1 -1
  499. package/src/nodes/pmrem/PMREMUtils.js +111 -2
  500. package/src/nodes/shapes/Shapes.js +1 -1
  501. package/src/nodes/tsl/TSLBase.js +6 -3
  502. package/src/nodes/tsl/TSLCore.js +488 -166
  503. package/src/nodes/utils/ArrayElementNode.js +14 -1
  504. package/src/nodes/utils/ConvertNode.js +1 -1
  505. package/src/nodes/utils/DebugNode.js +14 -13
  506. package/src/nodes/utils/EventNode.js +67 -2
  507. package/src/nodes/utils/FlipNode.js +1 -1
  508. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  509. package/src/nodes/utils/JoinNode.js +7 -4
  510. package/src/nodes/utils/LoopNode.js +20 -24
  511. package/src/nodes/utils/MemberNode.js +60 -8
  512. package/src/nodes/utils/Packing.js +13 -1
  513. package/src/nodes/utils/PostProcessingUtils.js +60 -1
  514. package/src/nodes/utils/RTTNode.js +14 -4
  515. package/src/nodes/utils/ReflectorNode.js +61 -11
  516. package/src/nodes/utils/Remap.js +48 -0
  517. package/src/nodes/utils/RotateNode.js +1 -1
  518. package/src/nodes/utils/SampleNode.js +12 -2
  519. package/src/nodes/utils/SetNode.js +1 -1
  520. package/src/nodes/utils/SplitNode.js +12 -1
  521. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  522. package/src/nodes/utils/Timer.js +0 -47
  523. package/src/nodes/utils/UVUtils.js +28 -0
  524. package/src/objects/BatchedMesh.js +46 -18
  525. package/src/objects/InstancedMesh.js +30 -3
  526. package/src/objects/LOD.js +1 -1
  527. package/src/objects/Line.js +3 -2
  528. package/src/objects/LineSegments.js +2 -1
  529. package/src/objects/Mesh.js +1 -1
  530. package/src/objects/Points.js +1 -1
  531. package/src/objects/Skeleton.js +12 -2
  532. package/src/objects/SkinnedMesh.js +29 -10
  533. package/src/objects/Sprite.js +4 -3
  534. package/src/renderers/WebGLRenderer.js +372 -179
  535. package/src/renderers/common/Animation.js +16 -4
  536. package/src/renderers/common/Attributes.js +16 -2
  537. package/src/renderers/common/Backend.js +137 -35
  538. package/src/renderers/common/Background.js +28 -14
  539. package/src/renderers/common/BindGroup.js +1 -16
  540. package/src/renderers/common/Binding.js +11 -0
  541. package/src/renderers/common/Bindings.js +83 -12
  542. package/src/renderers/common/BlendMode.js +143 -0
  543. package/src/renderers/common/Buffer.js +40 -0
  544. package/src/renderers/common/BundleGroup.js +1 -1
  545. package/src/renderers/common/CanvasTarget.js +341 -0
  546. package/src/renderers/common/ChainMap.js +30 -6
  547. package/src/renderers/common/ComputePipeline.js +1 -1
  548. package/src/renderers/common/CubeRenderTarget.js +51 -7
  549. package/src/renderers/common/DataMap.js +1 -1
  550. package/src/renderers/common/Geometries.js +55 -3
  551. package/src/renderers/common/Info.js +337 -6
  552. package/src/renderers/common/InspectorBase.js +151 -0
  553. package/src/renderers/common/Lighting.js +5 -21
  554. package/src/renderers/common/Pipelines.js +41 -8
  555. package/src/renderers/common/PostProcessing.js +9 -226
  556. package/src/renderers/common/QuadMesh.js +7 -1
  557. package/src/renderers/common/ReadbackBuffer.js +78 -0
  558. package/src/renderers/common/RenderBundle.js +3 -1
  559. package/src/renderers/common/RenderBundles.js +7 -3
  560. package/src/renderers/common/RenderContext.js +18 -2
  561. package/src/renderers/common/RenderContexts.js +33 -49
  562. package/src/renderers/common/RenderList.js +7 -3
  563. package/src/renderers/common/RenderLists.js +2 -1
  564. package/src/renderers/common/RenderObject.js +32 -6
  565. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  566. package/src/renderers/common/RenderObjects.js +22 -6
  567. package/src/renderers/common/RenderPipeline.js +232 -17
  568. package/src/renderers/common/Renderer.js +927 -335
  569. package/src/renderers/common/RendererUtils.js +9 -0
  570. package/src/renderers/common/SampledTexture.js +9 -1
  571. package/src/renderers/common/Sampler.js +52 -14
  572. package/src/renderers/common/StorageBuffer.js +13 -1
  573. package/src/renderers/common/StorageTexture.js +9 -1
  574. package/src/renderers/common/Textures.js +208 -47
  575. package/src/renderers/common/TimestampQueryPool.js +70 -6
  576. package/src/renderers/common/Uniform.js +8 -0
  577. package/src/renderers/common/UniformsGroup.js +64 -2
  578. package/src/renderers/common/XRManager.js +79 -51
  579. package/src/renderers/common/extras/PMREMGenerator.js +176 -79
  580. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  581. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  582. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
  583. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  584. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  585. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  586. package/src/renderers/shaders/DFGLUTData.js +49 -0
  587. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  588. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  589. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  590. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  591. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  592. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  593. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
  594. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  595. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  596. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  597. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  598. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  599. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  600. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  601. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  602. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
  603. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  604. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  605. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  606. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  607. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  608. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  609. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  610. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +221 -190
  611. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  612. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  613. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  614. package/src/renderers/shaders/ShaderChunk.js +5 -3
  615. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  616. package/src/renderers/shaders/ShaderLib/depth.glsl.js +4 -1
  617. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  618. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  619. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  620. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  621. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  622. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  623. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  624. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  625. package/src/renderers/shaders/ShaderLib.js +7 -6
  626. package/src/renderers/shaders/UniformsLib.js +8 -5
  627. package/src/renderers/shaders/UniformsUtils.js +52 -9
  628. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  629. package/src/renderers/webgl/WebGLBackground.js +15 -15
  630. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  631. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  632. package/src/renderers/webgl/WebGLCapabilities.js +11 -5
  633. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  634. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  635. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  636. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  637. package/src/renderers/webgl/WebGLInfo.js +3 -1
  638. package/src/renderers/webgl/WebGLLights.js +18 -1
  639. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  640. package/src/renderers/webgl/WebGLObjects.js +3 -1
  641. package/src/renderers/webgl/WebGLOutput.js +270 -0
  642. package/src/renderers/webgl/WebGLProgram.js +63 -122
  643. package/src/renderers/webgl/WebGLPrograms.js +65 -52
  644. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  645. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  646. package/src/renderers/webgl/WebGLShadowMap.js +191 -26
  647. package/src/renderers/webgl/WebGLState.js +79 -40
  648. package/src/renderers/webgl/WebGLTextures.js +234 -68
  649. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  650. package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
  651. package/src/renderers/webgl/WebGLUtils.js +8 -3
  652. package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
  653. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  654. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
  655. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  656. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  657. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  658. package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
  659. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
  660. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
  661. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
  662. package/src/renderers/webgpu/WebGPUBackend.js +403 -253
  663. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  664. package/src/renderers/webgpu/WebGPURenderer.js +5 -3
  665. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
  666. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
  667. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
  668. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  669. package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
  670. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
  671. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
  672. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
  673. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
  674. package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
  675. package/src/renderers/webxr/WebXRController.js +12 -0
  676. package/src/renderers/webxr/WebXRManager.js +45 -29
  677. package/src/textures/CubeDepthTexture.js +76 -0
  678. package/src/textures/ExternalTexture.js +15 -4
  679. package/src/textures/HTMLTexture.js +74 -0
  680. package/src/textures/Source.js +5 -4
  681. package/src/textures/Texture.js +19 -7
  682. package/src/textures/VideoTexture.js +2 -3
  683. package/src/utils.js +344 -3
  684. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  685. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  686. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  687. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  688. package/src/nodes/accessors/SceneNode.js +0 -144
  689. package/src/nodes/code/ScriptableNode.js +0 -726
  690. package/src/nodes/code/ScriptableValueNode.js +0 -253
  691. package/src/nodes/display/PosterizeNode.js +0 -65
  692. package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
  693. package/src/nodes/utils/RemapNode.js +0 -125
  694. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  695. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  696. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -2,7 +2,7 @@
2
2
  import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js';
3
3
  //*/
4
4
 
5
- import { GPUFeatureName, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension } from './utils/WebGPUConstants.js';
5
+ import { GPUFeatureName, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension, GPUFeatureMap } from './utils/WebGPUConstants.js';
6
6
 
7
7
  import WGSLNodeBuilder from './nodes/WGSLNodeBuilder.js';
8
8
  import Backend from '../common/Backend.js';
@@ -10,12 +10,15 @@ import Backend from '../common/Backend.js';
10
10
  import WebGPUUtils from './utils/WebGPUUtils.js';
11
11
  import WebGPUAttributeUtils from './utils/WebGPUAttributeUtils.js';
12
12
  import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
13
+ import WebGPUCapabilities from './utils/WebGPUCapabilities.js';
13
14
  import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
14
15
  import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
15
16
 
16
- import { WebGPUCoordinateSystem } from '../../constants.js';
17
+ import { WebGPUCoordinateSystem, TimestampQuery, REVISION, HalfFloatType, Compatibility } from '../../constants.js';
17
18
  import WebGPUTimestampQueryPool from './utils/WebGPUTimestampQueryPool.js';
18
- import { warnOnce } from '../../utils.js';
19
+ import { error } from '../../utils.js';
20
+
21
+ const _clearValue = { r: 0, g: 0, b: 0, a: 1 };
19
22
 
20
23
  /**
21
24
  * A backend implementation targeting WebGPU.
@@ -30,8 +33,8 @@ class WebGPUBackend extends Backend {
30
33
  *
31
34
  * @typedef {Object} WebGPUBackend~Options
32
35
  * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
36
+ * @property {boolean} [reversedDepthBuffer=false] - Whether reversed depth buffer is enabled or not.
33
37
  * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
34
- * @property {boolean} [compatibilityMode=false] - Whether the backend should be in compatibility mode or not.
35
38
  * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
36
39
  * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
37
40
  * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
@@ -64,16 +67,18 @@ class WebGPUBackend extends Backend {
64
67
 
65
68
  // some parameters require default values other than "undefined"
66
69
  this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha;
67
- this.parameters.compatibilityMode = ( parameters.compatibilityMode === undefined ) ? false : parameters.compatibilityMode;
68
70
 
69
71
  this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
70
72
 
71
73
  /**
72
- * Indicates whether the backend is in compatibility mode or not.
73
- * @type {boolean}
74
- * @default false
74
+ * Indicates whether the backend is in WebGPU compatibility mode or not.
75
+ * The backend must be initialized before the property can be evaluated.
76
+ *
77
+ * @type {?boolean}
78
+ * @readonly
79
+ * @default null
75
80
  */
76
- this.compatibilityMode = this.parameters.compatibilityMode;
81
+ this.compatibilityMode = null;
77
82
 
78
83
  /**
79
84
  * A reference to the device.
@@ -83,22 +88,6 @@ class WebGPUBackend extends Backend {
83
88
  */
84
89
  this.device = null;
85
90
 
86
- /**
87
- * A reference to the context.
88
- *
89
- * @type {?GPUCanvasContext}
90
- * @default null
91
- */
92
- this.context = null;
93
-
94
- /**
95
- * A reference to the color attachment of the default framebuffer.
96
- *
97
- * @type {?GPUTexture}
98
- * @default null
99
- */
100
- this.colorBuffer = null;
101
-
102
91
  /**
103
92
  * A reference to the default render pass descriptor.
104
93
  *
@@ -130,6 +119,14 @@ class WebGPUBackend extends Backend {
130
119
  */
131
120
  this.bindingUtils = new WebGPUBindingUtils( this );
132
121
 
122
+ /**
123
+ * A reference to a backend module holding device capability related
124
+ * utility functions.
125
+ *
126
+ * @type {WebGPUCapabilities}
127
+ */
128
+ this.capabilities = new WebGPUCapabilities( this );
129
+
133
130
  /**
134
131
  * A reference to a backend module holding shader pipeline-related
135
132
  * utility functions.
@@ -153,6 +150,19 @@ class WebGPUBackend extends Backend {
153
150
  */
154
151
  this.occludedResolveCache = new Map();
155
152
 
153
+ // compatibility checks
154
+
155
+ const compatibilityTextureCompare = typeof navigator === 'undefined' ? true : /Android/.test( navigator.userAgent ) === false;
156
+
157
+ /**
158
+ * A map of compatibility checks.
159
+ *
160
+ * @type {Object}
161
+ */
162
+ this._compatibility = {
163
+ [ Compatibility.TEXTURE_COMPARE ]: compatibilityTextureCompare
164
+ };
165
+
156
166
  }
157
167
 
158
168
  /**
@@ -178,7 +188,7 @@ class WebGPUBackend extends Backend {
178
188
 
179
189
  const adapterOptions = {
180
190
  powerPreference: parameters.powerPreference,
181
- featureLevel: parameters.compatibilityMode ? 'compatibility' : undefined
191
+ featureLevel: 'compatibility'
182
192
  };
183
193
 
184
194
  const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null;
@@ -218,8 +228,18 @@ class WebGPUBackend extends Backend {
218
228
 
219
229
  }
220
230
 
231
+ this.compatibilityMode = ! device.features.has( 'core-features-and-limits' );
232
+
233
+ if ( this.compatibilityMode ) {
234
+
235
+ renderer._samples = 0;
236
+
237
+ }
238
+
221
239
  device.lost.then( ( info ) => {
222
240
 
241
+ if ( info.reason === 'destroyed' ) return;
242
+
223
243
  const deviceLossInfo = {
224
244
  api: 'WebGPU',
225
245
  message: info.message || 'Unknown reason',
@@ -231,26 +251,66 @@ class WebGPUBackend extends Backend {
231
251
 
232
252
  } );
233
253
 
234
- const context = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgpu' );
235
-
236
254
  this.device = device;
237
- this.context = context;
238
-
239
- const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
240
255
 
241
256
  this.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery );
242
257
 
243
- this.context.configure( {
244
- device: this.device,
245
- format: this.utils.getPreferredCanvasFormat(),
246
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
247
- alphaMode: alphaMode
248
- } );
249
-
250
258
  this.updateSize();
251
259
 
252
260
  }
253
261
 
262
+ /**
263
+ * A reference to the context.
264
+ *
265
+ * @type {?GPUCanvasContext}
266
+ * @default null
267
+ */
268
+ get context() {
269
+
270
+ const canvasTarget = this.renderer.getCanvasTarget();
271
+ const canvasData = this.get( canvasTarget );
272
+
273
+ let context = canvasData.context;
274
+
275
+ if ( context === undefined ) {
276
+
277
+ const parameters = this.parameters;
278
+
279
+ if ( canvasTarget.isDefaultCanvasTarget === true && parameters.context !== undefined ) {
280
+
281
+ context = parameters.context;
282
+
283
+ } else {
284
+
285
+ context = canvasTarget.domElement.getContext( 'webgpu' );
286
+
287
+ }
288
+
289
+ // OffscreenCanvas does not have setAttribute, see #22811
290
+ if ( 'setAttribute' in canvasTarget.domElement ) canvasTarget.domElement.setAttribute( 'data-engine', `three.js r${ REVISION } webgpu` );
291
+
292
+ const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
293
+
294
+ const toneMappingMode = parameters.outputType === HalfFloatType ? 'extended' : 'standard';
295
+
296
+ context.configure( {
297
+ device: this.device,
298
+ format: this.utils.getPreferredCanvasFormat(),
299
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
300
+ alphaMode: alphaMode,
301
+ toneMapping: {
302
+ mode: toneMappingMode
303
+ }
304
+ } );
305
+
306
+ canvasData.context = context;
307
+
308
+ }
309
+
310
+ return context;
311
+
312
+ }
313
+
254
314
  /**
255
315
  * The coordinate system of the backend.
256
316
  *
@@ -265,15 +325,20 @@ class WebGPUBackend extends Backend {
265
325
 
266
326
  /**
267
327
  * This method performs a readback operation by moving buffer data from
268
- * a storage buffer attribute from the GPU to the CPU.
328
+ * a storage buffer attribute from the GPU to the CPU. ReadbackBuffer can
329
+ * be used to retain and reuse handles to the intermediate buffers and prevent
330
+ * new allocation.
269
331
  *
270
332
  * @async
271
- * @param {StorageBufferAttribute} attribute - The storage buffer attribute.
272
- * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.
333
+ * @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
334
+ * @param {number} count - The offset from which to start reading the
335
+ * @param {number} offset - The storage buffer attribute.
336
+ * @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
337
+ * @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
273
338
  */
274
- async getArrayBufferAsync( attribute ) {
339
+ async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
275
340
 
276
- return await this.attributeUtils.getArrayBufferAsync( attribute );
341
+ return await this.attributeUtils.getArrayBufferAsync( attribute, target, offset, count );
277
342
 
278
343
  }
279
344
 
@@ -300,19 +365,22 @@ class WebGPUBackend extends Backend {
300
365
  */
301
366
  _getDefaultRenderPassDescriptor() {
302
367
 
303
- let descriptor = this.defaultRenderPassdescriptor;
368
+ const renderer = this.renderer;
369
+ const canvasTarget = renderer.getCanvasTarget();
370
+ const canvasData = this.get( canvasTarget );
371
+ const samples = renderer.currentSamples;
304
372
 
305
- if ( descriptor === null ) {
373
+ let descriptor = canvasData.descriptor;
306
374
 
307
- const renderer = this.renderer;
375
+ if ( descriptor === undefined || canvasData.samples !== samples ) {
308
376
 
309
377
  descriptor = {
310
378
  colorAttachments: [ {
311
379
  view: null
312
- } ],
380
+ } ]
313
381
  };
314
382
 
315
- if ( this.renderer.depth === true || this.renderer.stencil === true ) {
383
+ if ( renderer.depth === true || renderer.stencil === true ) {
316
384
 
317
385
  descriptor.depthStencilAttachment = {
318
386
  view: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView()
@@ -322,9 +390,9 @@ class WebGPUBackend extends Backend {
322
390
 
323
391
  const colorAttachment = descriptor.colorAttachments[ 0 ];
324
392
 
325
- if ( this.renderer.samples > 0 ) {
393
+ if ( samples > 0 ) {
326
394
 
327
- colorAttachment.view = this.colorBuffer.createView();
395
+ colorAttachment.view = this.textureUtils.getColorBuffer().createView();
328
396
 
329
397
  } else {
330
398
 
@@ -332,13 +400,14 @@ class WebGPUBackend extends Backend {
332
400
 
333
401
  }
334
402
 
335
- this.defaultRenderPassdescriptor = descriptor;
403
+ canvasData.descriptor = descriptor;
404
+ canvasData.samples = samples;
336
405
 
337
406
  }
338
407
 
339
408
  const colorAttachment = descriptor.colorAttachments[ 0 ];
340
409
 
341
- if ( this.renderer.samples > 0 ) {
410
+ if ( samples > 0 ) {
342
411
 
343
412
  colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
344
413
 
@@ -384,9 +453,6 @@ class WebGPUBackend extends Backend {
384
453
  if ( descriptors === undefined ||
385
454
  renderTargetData.width !== renderTarget.width ||
386
455
  renderTargetData.height !== renderTarget.height ||
387
- renderTargetData.dimensions !== renderTarget.dimensions ||
388
- renderTargetData.activeMipmapLevel !== renderContext.activeMipmapLevel ||
389
- renderTargetData.activeCubeFace !== renderContext.activeCubeFace ||
390
456
  renderTargetData.samples !== renderTarget.samples
391
457
  ) {
392
458
 
@@ -394,21 +460,6 @@ class WebGPUBackend extends Backend {
394
460
 
395
461
  renderTargetData.descriptors = descriptors;
396
462
 
397
- // dispose
398
-
399
- const onDispose = () => {
400
-
401
- renderTarget.removeEventListener( 'dispose', onDispose );
402
- this.delete( renderTarget );
403
-
404
- };
405
-
406
- if ( renderTarget.hasEventListener( 'dispose', onDispose ) === false ) {
407
-
408
- renderTarget.addEventListener( 'dispose', onDispose );
409
-
410
- }
411
-
412
463
  }
413
464
 
414
465
  const cacheKey = renderContext.getCacheKey();
@@ -509,7 +560,7 @@ class WebGPUBackend extends Backend {
509
560
 
510
561
  const depthTextureData = this.get( renderContext.depthTexture );
511
562
  const options = {};
512
- if ( renderContext.depthTexture.isArrayTexture ) {
563
+ if ( renderContext.depthTexture.isArrayTexture || renderContext.depthTexture.isCubeTexture ) {
513
564
 
514
565
  options.dimension = GPUTextureViewDimension.TwoD;
515
566
  options.arrayLayerCount = 1;
@@ -528,7 +579,6 @@ class WebGPUBackend extends Backend {
528
579
  renderTargetData.samples = renderTarget.samples;
529
580
  renderTargetData.activeMipmapLevel = renderContext.activeMipmapLevel;
530
581
  renderTargetData.activeCubeFace = renderContext.activeCubeFace;
531
- renderTargetData.dimensions = renderTarget.dimensions;
532
582
 
533
583
  }
534
584
 
@@ -581,6 +631,8 @@ class WebGPUBackend extends Backend {
581
631
 
582
632
  const renderContextData = this.get( renderContext );
583
633
 
634
+ //
635
+
584
636
  const device = this.device;
585
637
  const occlusionQueryCount = renderContext.occlusionQueryCount;
586
638
 
@@ -621,7 +673,7 @@ class WebGPUBackend extends Backend {
621
673
 
622
674
  }
623
675
 
624
- this.initTimestampQuery( renderContext, descriptor );
676
+ this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ), descriptor );
625
677
 
626
678
  descriptor.occlusionQuerySet = occlusionQuerySet;
627
679
 
@@ -637,7 +689,21 @@ class WebGPUBackend extends Backend {
637
689
 
638
690
  if ( renderContext.clearColor ) {
639
691
 
640
- colorAttachment.clearValue = i === 0 ? renderContext.clearColorValue : { r: 0, g: 0, b: 0, a: 1 };
692
+ if ( i === 0 ) {
693
+
694
+ colorAttachment.clearValue = renderContext.clearColorValue;
695
+
696
+ } else {
697
+
698
+ _clearValue.r = 0;
699
+ _clearValue.g = 0;
700
+ _clearValue.b = 0;
701
+ _clearValue.a = 1;
702
+
703
+ colorAttachment.clearValue = _clearValue;
704
+
705
+ }
706
+
641
707
  colorAttachment.loadOp = GPULoadOp.Clear;
642
708
 
643
709
  } else {
@@ -766,8 +832,7 @@ class WebGPUBackend extends Backend {
766
832
 
767
833
  if ( renderContext.scissor ) {
768
834
 
769
- const { x, y, width, height } = renderContext.scissorValue;
770
- currentPass.setScissorRect( x, y, width, height );
835
+ this.updateScissor( renderContext );
771
836
 
772
837
  }
773
838
 
@@ -1127,6 +1192,20 @@ class WebGPUBackend extends Backend {
1127
1192
 
1128
1193
  }
1129
1194
 
1195
+ /**
1196
+ * Updates the scissor with the values from the given render context.
1197
+ *
1198
+ * @param {RenderContext} renderContext - The render context.
1199
+ */
1200
+ updateScissor( renderContext ) {
1201
+
1202
+ const { currentPass } = this.get( renderContext );
1203
+ const { x, y, width, height } = renderContext.scissorValue;
1204
+
1205
+ currentPass.setScissorRect( x, y, width, height );
1206
+
1207
+ }
1208
+
1130
1209
  /**
1131
1210
  * Returns the clear color and alpha into a single
1132
1211
  * color object.
@@ -1166,7 +1245,6 @@ class WebGPUBackend extends Backend {
1166
1245
 
1167
1246
  let colorAttachments = [];
1168
1247
  let depthStencilAttachment;
1169
- let clearValue;
1170
1248
 
1171
1249
  let supportsDepth;
1172
1250
  let supportsStencil;
@@ -1174,7 +1252,11 @@ class WebGPUBackend extends Backend {
1174
1252
  if ( color ) {
1175
1253
 
1176
1254
  const clearColor = this.getClearColor();
1177
- clearValue = { r: clearColor.r, g: clearColor.g, b: clearColor.b, a: clearColor.a };
1255
+
1256
+ _clearValue.r = clearColor.r;
1257
+ _clearValue.g = clearColor.g;
1258
+ _clearValue.b = clearColor.b;
1259
+ _clearValue.a = clearColor.a;
1178
1260
 
1179
1261
  }
1180
1262
 
@@ -1191,7 +1273,7 @@ class WebGPUBackend extends Backend {
1191
1273
 
1192
1274
  const colorAttachment = colorAttachments[ 0 ];
1193
1275
 
1194
- colorAttachment.clearValue = clearValue;
1276
+ colorAttachment.clearValue = _clearValue;
1195
1277
  colorAttachment.loadOp = GPULoadOp.Clear;
1196
1278
  colorAttachment.storeOp = GPUStoreOp.Store;
1197
1279
 
@@ -1210,7 +1292,7 @@ class WebGPUBackend extends Backend {
1210
1292
 
1211
1293
  const clearConfig = {
1212
1294
  loadOp: color ? GPULoadOp.Clear : GPULoadOp.Load,
1213
- clearValue: color ? clearValue : undefined
1295
+ clearValue: color ? _clearValue : undefined
1214
1296
  };
1215
1297
 
1216
1298
  if ( supportsDepth ) {
@@ -1298,11 +1380,13 @@ class WebGPUBackend extends Backend {
1298
1380
 
1299
1381
  const groupGPU = this.get( computeGroup );
1300
1382
 
1383
+ //
1384
+
1301
1385
  const descriptor = {
1302
1386
  label: 'computeGroup_' + computeGroup.id
1303
1387
  };
1304
1388
 
1305
- this.initTimestampQuery( computeGroup, descriptor );
1389
+ this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ), descriptor );
1306
1390
 
1307
1391
  groupGPU.cmdEncoderGPU = this.device.createCommandEncoder( { label: 'computeGroup_' + computeGroup.id } );
1308
1392
 
@@ -1317,9 +1401,12 @@ class WebGPUBackend extends Backend {
1317
1401
  * @param {Node} computeNode - The compute node.
1318
1402
  * @param {Array<BindGroup>} bindings - The bindings.
1319
1403
  * @param {ComputePipeline} pipeline - The compute pipeline.
1320
- * @param {Array<number>|number} [dispatchSizeOrCount=null] - Array with [ x, y, z ] values for dispatch or a single number for the count.
1404
+ * @param {number|Array<number>|IndirectStorageBufferAttribute} [dispatchSize=null]
1405
+ * - A single number representing count, or
1406
+ * - An array [x, y, z] representing dispatch size, or
1407
+ * - A IndirectStorageBufferAttribute for indirect dispatch size.
1321
1408
  */
1322
- compute( computeGroup, computeNode, bindings, pipeline, dispatchSizeOrCount = null ) {
1409
+ compute( computeGroup, computeNode, bindings, pipeline, dispatchSize = null ) {
1323
1410
 
1324
1411
  const computeNodeData = this.get( computeNode );
1325
1412
  const { passEncoderGPU } = this.get( computeGroup );
@@ -1341,19 +1428,29 @@ class WebGPUBackend extends Backend {
1341
1428
 
1342
1429
  }
1343
1430
 
1344
- let dispatchSize;
1431
+ if ( dispatchSize === null ) {
1432
+
1433
+ dispatchSize = computeNode.dispatchSize || computeNode.count;
1434
+
1435
+ }
1436
+
1437
+ // When the dispatchSize is set with a StorageBuffer from the GPU.
1438
+
1439
+ if ( dispatchSize && dispatchSize.isIndirectStorageBufferAttribute ) {
1345
1440
 
1346
- if ( dispatchSizeOrCount === null ) {
1441
+ const dispatchBuffer = this.get( dispatchSize ).buffer;
1347
1442
 
1348
- dispatchSizeOrCount = computeNode.count;
1443
+ passEncoderGPU.dispatchWorkgroupsIndirect( dispatchBuffer, 0 );
1444
+
1445
+ return;
1349
1446
 
1350
1447
  }
1351
1448
 
1352
- if ( typeof dispatchSizeOrCount === 'number' ) {
1449
+ if ( typeof dispatchSize === 'number' ) {
1353
1450
 
1354
1451
  // If a single number is given, we calculate the dispatch size based on the workgroup size
1355
1452
 
1356
- const count = dispatchSizeOrCount;
1453
+ const count = dispatchSize;
1357
1454
 
1358
1455
  if ( computeNodeData.dispatchSize === undefined || computeNodeData.count !== count ) {
1359
1456
 
@@ -1390,10 +1487,6 @@ class WebGPUBackend extends Backend {
1390
1487
 
1391
1488
  dispatchSize = computeNodeData.dispatchSize;
1392
1489
 
1393
- } else {
1394
-
1395
- dispatchSize = dispatchSizeOrCount;
1396
-
1397
1490
  }
1398
1491
 
1399
1492
  //
@@ -1423,192 +1516,200 @@ class WebGPUBackend extends Backend {
1423
1516
  }
1424
1517
 
1425
1518
  /**
1426
- * Can be used to synchronize CPU operations with GPU tasks. So when this method is called,
1427
- * the CPU waits for the GPU to complete its operation (e.g. a compute task).
1428
- *
1429
- * @async
1430
- * @return {Promise} A Promise that resolves when synchronization has been finished.
1431
- */
1432
- async waitForGPU() {
1433
-
1434
- await this.device.queue.onSubmittedWorkDone();
1435
-
1436
- }
1437
-
1438
- // render object
1439
-
1440
- /**
1441
- * Executes a draw command for the given render object.
1519
+ * Internal draw function that performs the draw with the given pass encoder.
1442
1520
  *
1443
- * @param {RenderObject} renderObject - The render object to draw.
1521
+ * @private
1522
+ * @param {RenderObject} renderObject - The render object.
1444
1523
  * @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.
1524
+ * @param {Object} renderContextData - The render context data object, holding current pass state and occlusion query tracking.
1525
+ * @param {GPURenderPipeline} pipelineGPU - The GPU render pipeline.
1526
+ * @param {Array<BindGroup>} bindings - The bind groups.
1527
+ * @param {Array<BufferAttribute>} vertexBuffers - The vertex buffers.
1528
+ * @param {{vertexCount: number, firstVertex: number, instanceCount: number, firstInstance: number}} drawParams - The draw parameters.
1529
+ * @param {GPURenderPassEncoder|GPURenderBundleEncoder} passEncoderGPU - The GPU pass encoder used for recording draw commands.
1530
+ * @param {Object} currentSets - Tracking object for currently set pipeline, attributes, bind groups, and index state.
1445
1531
  */
1446
- draw( renderObject, info ) {
1532
+ _draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, passEncoderGPU, currentSets ) {
1447
1533
 
1448
- const { object, material, context, pipeline } = renderObject;
1449
- const bindings = renderObject.getBindings();
1450
- const renderContextData = this.get( context );
1451
- const pipelineGPU = this.get( pipeline ).pipeline;
1534
+ const { object, material, context } = renderObject;
1452
1535
 
1453
1536
  const index = renderObject.getIndex();
1454
1537
  const hasIndex = ( index !== null );
1455
1538
 
1456
-
1457
- const drawParams = renderObject.getDrawParameters();
1458
- if ( drawParams === null ) return;
1459
-
1460
1539
  // pipeline
1540
+ this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
1541
+ currentSets.pipeline = pipelineGPU;
1461
1542
 
1462
- const setPipelineAndBindings = ( passEncoderGPU, currentSets ) => {
1543
+ // bind groups
1544
+ const currentBindingGroups = currentSets.bindingGroups;
1545
+ for ( let i = 0, l = bindings.length; i < l; i ++ ) {
1463
1546
 
1464
- // pipeline
1465
- this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
1466
- currentSets.pipeline = pipelineGPU;
1547
+ const bindGroup = bindings[ i ];
1548
+ const bindingsData = this.get( bindGroup );
1549
+ if ( currentBindingGroups[ i ] !== bindGroup.id ) {
1467
1550
 
1468
- // bind groups
1469
- const currentBindingGroups = currentSets.bindingGroups;
1470
- for ( let i = 0, l = bindings.length; i < l; i ++ ) {
1551
+ passEncoderGPU.setBindGroup( i, bindingsData.group );
1552
+ currentBindingGroups[ i ] = bindGroup.id;
1471
1553
 
1472
- const bindGroup = bindings[ i ];
1473
- const bindingsData = this.get( bindGroup );
1474
- if ( currentBindingGroups[ bindGroup.index ] !== bindGroup.id ) {
1554
+ }
1475
1555
 
1476
- passEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group );
1477
- currentBindingGroups[ bindGroup.index ] = bindGroup.id;
1556
+ }
1478
1557
 
1479
- }
1558
+ // attributes
1480
1559
 
1481
- }
1560
+ // index
1482
1561
 
1483
- // attributes
1562
+ if ( hasIndex === true ) {
1484
1563
 
1485
- // index
1564
+ if ( currentSets.index !== index ) {
1486
1565
 
1487
- if ( hasIndex === true ) {
1566
+ const buffer = this.get( index ).buffer;
1567
+ const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
1488
1568
 
1489
- if ( currentSets.index !== index ) {
1569
+ passEncoderGPU.setIndexBuffer( buffer, indexFormat );
1490
1570
 
1491
- const buffer = this.get( index ).buffer;
1492
- const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
1571
+ currentSets.index = index;
1493
1572
 
1494
- passEncoderGPU.setIndexBuffer( buffer, indexFormat );
1573
+ }
1495
1574
 
1496
- currentSets.index = index;
1575
+ }
1497
1576
 
1498
- }
1577
+ for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {
1499
1578
 
1500
- }
1501
- // vertex buffers
1579
+ const vertexBuffer = vertexBuffers[ i ];
1502
1580
 
1503
- const vertexBuffers = renderObject.getVertexBuffers();
1581
+ if ( currentSets.attributes[ i ] !== vertexBuffer ) {
1504
1582
 
1505
- for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {
1583
+ const buffer = this.get( vertexBuffer ).buffer;
1584
+ passEncoderGPU.setVertexBuffer( i, buffer );
1506
1585
 
1507
- const vertexBuffer = vertexBuffers[ i ];
1586
+ currentSets.attributes[ i ] = vertexBuffer;
1508
1587
 
1509
- if ( currentSets.attributes[ i ] !== vertexBuffer ) {
1588
+ }
1510
1589
 
1511
- const buffer = this.get( vertexBuffer ).buffer;
1512
- passEncoderGPU.setVertexBuffer( i, buffer );
1590
+ }
1591
+ // stencil
1513
1592
 
1514
- currentSets.attributes[ i ] = vertexBuffer;
1593
+ if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {
1515
1594
 
1516
- }
1595
+ passEncoderGPU.setStencilReference( material.stencilRef );
1596
+ renderContextData.currentStencilRef = material.stencilRef;
1517
1597
 
1518
- }
1519
- // stencil
1598
+ }
1520
1599
 
1521
- if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {
1600
+ if ( object.isBatchedMesh === true ) {
1522
1601
 
1523
- passEncoderGPU.setStencilReference( material.stencilRef );
1524
- renderContextData.currentStencilRef = material.stencilRef;
1602
+ const starts = object._multiDrawStarts;
1603
+ const counts = object._multiDrawCounts;
1604
+ const drawCount = object._multiDrawCount;
1525
1605
 
1526
- }
1606
+ let bytesPerElement = ( hasIndex === true ) ? index.array.BYTES_PER_ELEMENT : 1;
1527
1607
 
1608
+ if ( material.wireframe ) {
1528
1609
 
1529
- };
1610
+ bytesPerElement = object.geometry.attributes.position.count > 65535 ? 4 : 2;
1530
1611
 
1531
- // Define draw function
1532
- const draw = ( passEncoderGPU, currentSets ) => {
1612
+ }
1533
1613
 
1534
- setPipelineAndBindings( passEncoderGPU, currentSets );
1614
+ for ( let i = 0; i < drawCount; i ++ ) {
1535
1615
 
1536
- if ( object.isBatchedMesh === true ) {
1616
+ if ( hasIndex === true ) {
1537
1617
 
1538
- const starts = object._multiDrawStarts;
1539
- const counts = object._multiDrawCounts;
1540
- const drawCount = object._multiDrawCount;
1541
- const drawInstances = object._multiDrawInstances;
1618
+ passEncoderGPU.drawIndexed( counts[ i ], 1, starts[ i ] / bytesPerElement, 0, i );
1542
1619
 
1543
- if ( drawInstances !== null ) {
1620
+ } else {
1544
1621
 
1545
- // @deprecated, r174
1546
- warnOnce( 'THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
1622
+ passEncoderGPU.draw( counts[ i ], 1, starts[ i ], i );
1547
1623
 
1548
1624
  }
1549
1625
 
1550
- for ( let i = 0; i < drawCount; i ++ ) {
1626
+ info.update( object, counts[ i ], 1 );
1551
1627
 
1552
- const count = drawInstances ? drawInstances[ i ] : 1;
1553
- const firstInstance = count > 1 ? 0 : i;
1628
+ }
1554
1629
 
1555
- if ( hasIndex === true ) {
1630
+ } else if ( hasIndex === true ) {
1556
1631
 
1557
- passEncoderGPU.drawIndexed( counts[ i ], count, starts[ i ] / index.array.BYTES_PER_ELEMENT, 0, firstInstance );
1632
+ const { vertexCount: indexCount, instanceCount, firstVertex: firstIndex } = drawParams;
1558
1633
 
1559
- } else {
1634
+ const indirect = renderObject.getIndirect();
1560
1635
 
1561
- passEncoderGPU.draw( counts[ i ], count, starts[ i ], firstInstance );
1636
+ if ( indirect !== null ) {
1562
1637
 
1563
- }
1638
+ const buffer = this.get( indirect ).buffer;
1639
+ const indirectOffset = renderObject.getIndirectOffset();
1640
+ const indirectOffsets = Array.isArray( indirectOffset ) ? indirectOffset : [ indirectOffset ];
1641
+
1642
+ for ( let i = 0; i < indirectOffsets.length; i ++ ) {
1564
1643
 
1565
- info.update( object, counts[ i ], count );
1644
+ passEncoderGPU.drawIndexedIndirect( buffer, indirectOffsets[ i ] );
1566
1645
 
1567
1646
  }
1568
1647
 
1569
- } else if ( hasIndex === true ) {
1648
+ } else {
1649
+
1650
+ passEncoderGPU.drawIndexed( indexCount, instanceCount, firstIndex, 0, 0 );
1570
1651
 
1571
- const { vertexCount: indexCount, instanceCount, firstVertex: firstIndex } = drawParams;
1652
+ }
1653
+
1654
+ info.update( object, indexCount, instanceCount );
1572
1655
 
1573
- const indirect = renderObject.getIndirect();
1656
+ } else {
1574
1657
 
1575
- if ( indirect !== null ) {
1658
+ const { vertexCount, instanceCount, firstVertex } = drawParams;
1576
1659
 
1577
- const buffer = this.get( indirect ).buffer;
1660
+ const indirect = renderObject.getIndirect();
1578
1661
 
1579
- passEncoderGPU.drawIndexedIndirect( buffer, 0 );
1662
+ if ( indirect !== null ) {
1580
1663
 
1581
- } else {
1664
+ const buffer = this.get( indirect ).buffer;
1665
+ const indirectOffset = renderObject.getIndirectOffset();
1666
+ const indirectOffsets = Array.isArray( indirectOffset ) ? indirectOffset : [ indirectOffset ];
1582
1667
 
1583
- passEncoderGPU.drawIndexed( indexCount, instanceCount, firstIndex, 0, 0 );
1668
+ for ( let i = 0; i < indirectOffsets.length; i ++ ) {
1669
+
1670
+ passEncoderGPU.drawIndirect( buffer, indirectOffsets[ i ] );
1584
1671
 
1585
1672
  }
1586
1673
 
1587
- info.update( object, indexCount, instanceCount );
1588
1674
 
1589
1675
  } else {
1590
1676
 
1591
- const { vertexCount, instanceCount, firstVertex } = drawParams;
1677
+ passEncoderGPU.draw( vertexCount, instanceCount, firstVertex, 0 );
1592
1678
 
1593
- const indirect = renderObject.getIndirect();
1679
+ }
1594
1680
 
1595
- if ( indirect !== null ) {
1681
+ info.update( object, vertexCount, instanceCount );
1596
1682
 
1597
- const buffer = this.get( indirect ).buffer;
1683
+ }
1598
1684
 
1599
- passEncoderGPU.drawIndirect( buffer, 0 );
1685
+ }
1600
1686
 
1601
- } else {
1687
+ // render object
1602
1688
 
1603
- passEncoderGPU.draw( vertexCount, instanceCount, firstVertex, 0 );
1689
+ /**
1690
+ * Executes a draw command for the given render object.
1691
+ *
1692
+ * @param {RenderObject} renderObject - The render object to draw.
1693
+ * @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.
1694
+ */
1695
+ draw( renderObject, info ) {
1604
1696
 
1605
- }
1697
+ const { object, context, pipeline } = renderObject;
1698
+ const renderContextData = this.get( context );
1699
+ const pipelineData = this.get( pipeline );
1700
+ const pipelineGPU = pipelineData.pipeline;
1606
1701
 
1607
- info.update( object, vertexCount, instanceCount );
1702
+ // Skip if pipeline has error
1703
+ if ( pipelineData.error === true ) return;
1608
1704
 
1609
- }
1705
+ const drawParams = renderObject.getDrawParameters();
1706
+ if ( drawParams === null ) return;
1610
1707
 
1611
- };
1708
+ const bindings = renderObject.getBindings();
1709
+
1710
+ // vertex buffers
1711
+
1712
+ const vertexBuffers = renderObject.getVertexBuffers();
1612
1713
 
1613
1714
  if ( renderObject.camera.isArrayCamera && renderObject.camera.cameras.length > 0 ) {
1614
1715
 
@@ -1627,7 +1728,9 @@ class WebGPUBackend extends Backend {
1627
1728
 
1628
1729
  data[ 0 ] = i;
1629
1730
 
1630
- const bindGroupIndex = this.bindingUtils.createBindGroupIndex( data, bindingsData.layout );
1731
+ const { layoutGPU } = bindingsData.layout;
1732
+
1733
+ const bindGroupIndex = this.bindingUtils.createBindGroupIndex( data, layoutGPU );
1631
1734
 
1632
1735
  indexesGPU.push( bindGroupIndex );
1633
1736
 
@@ -1647,8 +1750,6 @@ class WebGPUBackend extends Backend {
1647
1750
 
1648
1751
  const vp = subCamera.viewport;
1649
1752
 
1650
-
1651
-
1652
1753
  let pass = renderContextData.currentPass;
1653
1754
  let sets = renderContextData.currentSets;
1654
1755
  if ( renderContextData.bundleEncoders ) {
@@ -1660,8 +1761,6 @@ class WebGPUBackend extends Backend {
1660
1761
 
1661
1762
  }
1662
1763
 
1663
-
1664
-
1665
1764
  if ( vp ) {
1666
1765
 
1667
1766
  pass.setViewport(
@@ -1675,17 +1774,16 @@ class WebGPUBackend extends Backend {
1675
1774
 
1676
1775
  }
1677
1776
 
1678
-
1679
1777
  // Set camera index binding for this layer
1680
1778
  if ( cameraIndex && cameraData.indexesGPU ) {
1681
1779
 
1682
- pass.setBindGroup( cameraIndex.index, cameraData.indexesGPU[ i ] );
1683
- sets.bindingGroups[ cameraIndex.index ] = cameraIndex.id;
1780
+ const indexPos = bindings.indexOf( cameraIndex );
1781
+ pass.setBindGroup( indexPos, cameraData.indexesGPU[ i ] );
1782
+ sets.bindingGroups[ indexPos ] = cameraIndex.id;
1684
1783
 
1685
1784
  }
1686
1785
 
1687
- draw( pass, sets );
1688
-
1786
+ this._draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, pass, sets );
1689
1787
 
1690
1788
  }
1691
1789
 
@@ -1722,7 +1820,7 @@ class WebGPUBackend extends Backend {
1722
1820
 
1723
1821
  }
1724
1822
 
1725
- draw( renderContextData.currentPass, renderContextData.currentSets );
1823
+ this._draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, renderContextData.currentPass, renderContextData.currentSets );
1726
1824
 
1727
1825
  }
1728
1826
 
@@ -1807,6 +1905,11 @@ class WebGPUBackend extends Backend {
1807
1905
  const utils = this.utils;
1808
1906
  const renderContext = renderObject.context;
1809
1907
 
1908
+ // meshes with negative scale have a different frontFace render pipeline
1909
+ // descriptor value so the following must be honored in the cache key
1910
+
1911
+ const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
1912
+
1810
1913
  return [
1811
1914
  material.transparent, material.blending, material.premultipliedAlpha,
1812
1915
  material.blendSrc, material.blendDst, material.blendEquation,
@@ -1817,6 +1920,7 @@ class WebGPUBackend extends Backend {
1817
1920
  material.stencilFail, material.stencilZFail, material.stencilZPass,
1818
1921
  material.stencilFuncMask, material.stencilWriteMask,
1819
1922
  material.side,
1923
+ frontFaceCW,
1820
1924
  utils.getSampleCountRenderContext( renderContext ),
1821
1925
  utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ),
1822
1926
  utils.getPrimitiveTopology( object, material ),
@@ -1829,24 +1933,14 @@ class WebGPUBackend extends Backend {
1829
1933
  // textures
1830
1934
 
1831
1935
  /**
1832
- * Creates a GPU sampler for the given texture.
1936
+ * Updates a GPU sampler for the given texture.
1833
1937
  *
1834
- * @param {Texture} texture - The texture to create the sampler for.
1938
+ * @param {Texture} texture - The texture to update the sampler for.
1939
+ * @return {string} The current sampler key.
1835
1940
  */
1836
- createSampler( texture ) {
1941
+ updateSampler( texture ) {
1837
1942
 
1838
- this.textureUtils.createSampler( texture );
1839
-
1840
- }
1841
-
1842
- /**
1843
- * Destroys the GPU sampler for the given texture.
1844
- *
1845
- * @param {Texture} texture - The texture to destroy the sampler for.
1846
- */
1847
- destroySampler( texture ) {
1848
-
1849
- this.textureUtils.destroySampler( texture );
1943
+ return this.textureUtils.updateSampler( texture );
1850
1944
 
1851
1945
  }
1852
1946
 
@@ -1855,10 +1949,11 @@ class WebGPUBackend extends Backend {
1855
1949
  * as a placeholder until the actual texture is ready for usage.
1856
1950
  *
1857
1951
  * @param {Texture} texture - The texture to create a default texture for.
1952
+ * @return {boolean} Whether the sampler has been updated or not.
1858
1953
  */
1859
1954
  createDefaultTexture( texture ) {
1860
1955
 
1861
- this.textureUtils.createDefaultTexture( texture );
1956
+ return this.textureUtils.createDefaultTexture( texture );
1862
1957
 
1863
1958
  }
1864
1959
 
@@ -1901,10 +1996,11 @@ class WebGPUBackend extends Backend {
1901
1996
  * Destroys the GPU data for the given texture object.
1902
1997
  *
1903
1998
  * @param {Texture} texture - The texture.
1999
+ * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
1904
2000
  */
1905
- destroyTexture( texture ) {
2001
+ destroyTexture( texture, isDefaultTexture = false ) {
1906
2002
 
1907
- this.textureUtils.destroyTexture( texture );
2003
+ this.textureUtils.destroyTexture( texture, isDefaultTexture );
1908
2004
 
1909
2005
  }
1910
2006
 
@@ -1929,15 +2025,14 @@ class WebGPUBackend extends Backend {
1929
2025
  /**
1930
2026
  * Inits a time stamp query for the given render context.
1931
2027
  *
1932
- * @param {RenderContext} renderContext - The render context.
2028
+ * @param {string} type - The type of the timestamp query (e.g. 'render', 'compute').
2029
+ * @param {number} uid - Unique id for the context (e.g. render context id).
1933
2030
  * @param {Object} descriptor - The query descriptor.
1934
2031
  */
1935
- initTimestampQuery( renderContext, descriptor ) {
2032
+ initTimestampQuery( type, uid, descriptor ) {
1936
2033
 
1937
2034
  if ( ! this.trackTimestamp ) return;
1938
2035
 
1939
- const type = renderContext.isComputeNode ? 'compute' : 'render';
1940
-
1941
2036
  if ( ! this.timestampQueryPool[ type ] ) {
1942
2037
 
1943
2038
  // TODO: Variable maxQueries?
@@ -1947,13 +2042,13 @@ class WebGPUBackend extends Backend {
1947
2042
 
1948
2043
  const timestampQueryPool = this.timestampQueryPool[ type ];
1949
2044
 
1950
- const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext );
2045
+ const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
1951
2046
 
1952
2047
  descriptor.timestampWrites = {
1953
2048
  querySet: timestampQueryPool.querySet,
1954
2049
  beginningOfPassWriteIndex: baseOffset,
1955
2050
  endOfPassWriteIndex: baseOffset + 1,
1956
- };
2051
+ };
1957
2052
 
1958
2053
  }
1959
2054
 
@@ -2122,6 +2217,17 @@ class WebGPUBackend extends Backend {
2122
2217
 
2123
2218
  }
2124
2219
 
2220
+ /**
2221
+ * Delete data associated with the current bind group.
2222
+ *
2223
+ * @param {BindGroup} bindGroup - The bind group.
2224
+ */
2225
+ deleteBindGroupData( bindGroup ) {
2226
+
2227
+ this.bindingUtils.deleteBindGroupData( bindGroup );
2228
+
2229
+ }
2230
+
2125
2231
  // attributes
2126
2232
 
2127
2233
  /**
@@ -2205,32 +2311,22 @@ class WebGPUBackend extends Backend {
2205
2311
  */
2206
2312
  updateSize() {
2207
2313
 
2208
- this.colorBuffer = this.textureUtils.getColorBuffer();
2209
- this.defaultRenderPassdescriptor = null;
2314
+ this.delete( this.renderer.getCanvasTarget() );
2210
2315
 
2211
2316
  }
2212
2317
 
2213
2318
  // utils public
2214
2319
 
2215
2320
  /**
2216
- * Returns the maximum anisotropy texture filtering value.
2217
- *
2218
- * @return {number} The maximum anisotropy texture filtering value.
2219
- */
2220
- getMaxAnisotropy() {
2221
-
2222
- return 16;
2223
-
2224
- }
2225
-
2226
- /**
2227
- * Checks if the given feature is supported by the backend.
2321
+ * Checks if the given feature is supported by the backend.
2228
2322
  *
2229
2323
  * @param {string} name - The feature's name.
2230
2324
  * @return {boolean} Whether the feature is supported or not.
2231
2325
  */
2232
2326
  hasFeature( name ) {
2233
2327
 
2328
+ if ( GPUFeatureMap[ name ] !== undefined ) name = GPUFeatureMap[ name ];
2329
+
2234
2330
  return this.device.features.has( name );
2235
2331
 
2236
2332
  }
@@ -2369,7 +2465,7 @@ class WebGPUBackend extends Backend {
2369
2465
 
2370
2466
  if ( sourceGPU.format !== destinationGPU.format ) {
2371
2467
 
2372
- console.error( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format );
2468
+ error( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format );
2373
2469
 
2374
2470
  return;
2375
2471
 
@@ -2403,6 +2499,15 @@ class WebGPUBackend extends Backend {
2403
2499
  ]
2404
2500
  );
2405
2501
 
2502
+ // mipmaps must be genereated with the same encoder otherwise the copied texture data
2503
+ // might be out-of-sync, see #31768
2504
+
2505
+ if ( texture.generateMipmaps ) {
2506
+
2507
+ this.textureUtils.generateMipmaps( texture, encoder );
2508
+
2509
+ }
2510
+
2406
2511
  if ( renderContextData.currentPass ) {
2407
2512
 
2408
2513
  const { descriptor } = renderContextData;
@@ -2427,9 +2532,7 @@ class WebGPUBackend extends Backend {
2427
2532
 
2428
2533
  if ( renderContext.scissor ) {
2429
2534
 
2430
- const { x, y, width, height } = renderContext.scissorValue;
2431
-
2432
- renderContextData.currentPass.setScissorRect( x, y, width, height );
2535
+ this.updateScissor( renderContext );
2433
2536
 
2434
2537
  }
2435
2538
 
@@ -2439,9 +2542,56 @@ class WebGPUBackend extends Backend {
2439
2542
 
2440
2543
  }
2441
2544
 
2442
- if ( texture.generateMipmaps ) {
2545
+ }
2546
+
2547
+ /**
2548
+ * Checks if the given compatibility is supported by the backend.
2549
+ *
2550
+ * @param {string} name - The compatibility name.
2551
+ * @return {boolean} Whether the compatibility is supported or not.
2552
+ */
2553
+ hasCompatibility( name ) {
2554
+
2555
+ if ( this._compatibility[ name ] !== undefined ) {
2556
+
2557
+ return this._compatibility[ name ];
2558
+
2559
+ }
2560
+
2561
+ return super.hasCompatibility( name );
2562
+
2563
+ }
2564
+
2565
+ dispose() {
2566
+
2567
+ this.bindingUtils.dispose();
2568
+ this.textureUtils.dispose();
2569
+
2570
+ if ( this.occludedResolveCache ) {
2571
+
2572
+ for ( const buffer of this.occludedResolveCache.values() ) {
2573
+
2574
+ buffer.destroy();
2575
+
2576
+ }
2577
+
2578
+ this.occludedResolveCache.clear();
2579
+
2580
+ }
2581
+
2582
+ if ( this.timestampQueryPool ) {
2583
+
2584
+ for ( const queryPool of Object.values( this.timestampQueryPool ) ) {
2585
+
2586
+ if ( queryPool !== null ) queryPool.dispose();
2587
+
2588
+ }
2589
+
2590
+ }
2591
+
2592
+ if ( this.parameters.device === undefined && this.device !== null ) {
2443
2593
 
2444
- this.textureUtils.generateMipmaps( texture );
2594
+ this.device.destroy();
2445
2595
 
2446
2596
  }
2447
2597