super-three 0.181.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -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, TimestampQuery, REVISION, HalfFloatType } from '../../constants.js';
17
+ import { WebGPUCoordinateSystem, TimestampQuery, REVISION, HalfFloatType, Compatibility } from '../../constants.js';
17
18
  import WebGPUTimestampQueryPool from './utils/WebGPUTimestampQueryPool.js';
18
- import { warnOnce, error } 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.
@@ -114,6 +119,14 @@ class WebGPUBackend extends Backend {
114
119
  */
115
120
  this.bindingUtils = new WebGPUBindingUtils( this );
116
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
+
117
130
  /**
118
131
  * A reference to a backend module holding shader pipeline-related
119
132
  * utility functions.
@@ -137,6 +150,19 @@ class WebGPUBackend extends Backend {
137
150
  */
138
151
  this.occludedResolveCache = new Map();
139
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
+
140
166
  }
141
167
 
142
168
  /**
@@ -162,7 +188,7 @@ class WebGPUBackend extends Backend {
162
188
 
163
189
  const adapterOptions = {
164
190
  powerPreference: parameters.powerPreference,
165
- featureLevel: parameters.compatibilityMode ? 'compatibility' : undefined
191
+ featureLevel: 'compatibility'
166
192
  };
167
193
 
168
194
  const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null;
@@ -202,8 +228,18 @@ class WebGPUBackend extends Backend {
202
228
 
203
229
  }
204
230
 
231
+ this.compatibilityMode = ! device.features.has( 'core-features-and-limits' );
232
+
233
+ if ( this.compatibilityMode ) {
234
+
235
+ renderer._samples = 0;
236
+
237
+ }
238
+
205
239
  device.lost.then( ( info ) => {
206
240
 
241
+ if ( info.reason === 'destroyed' ) return;
242
+
207
243
  const deviceLossInfo = {
208
244
  api: 'WebGPU',
209
245
  message: info.message || 'Unknown reason',
@@ -289,15 +325,20 @@ class WebGPUBackend extends Backend {
289
325
 
290
326
  /**
291
327
  * This method performs a readback operation by moving buffer data from
292
- * 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.
293
331
  *
294
332
  * @async
295
- * @param {StorageBufferAttribute} attribute - The storage buffer attribute.
296
- * @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.
297
338
  */
298
- async getArrayBufferAsync( attribute ) {
339
+ async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
299
340
 
300
- return await this.attributeUtils.getArrayBufferAsync( attribute );
341
+ return await this.attributeUtils.getArrayBufferAsync( attribute, target, offset, count );
301
342
 
302
343
  }
303
344
 
@@ -519,7 +560,7 @@ class WebGPUBackend extends Backend {
519
560
 
520
561
  const depthTextureData = this.get( renderContext.depthTexture );
521
562
  const options = {};
522
- if ( renderContext.depthTexture.isArrayTexture ) {
563
+ if ( renderContext.depthTexture.isArrayTexture || renderContext.depthTexture.isCubeTexture ) {
523
564
 
524
565
  options.dimension = GPUTextureViewDimension.TwoD;
525
566
  options.arrayLayerCount = 1;
@@ -648,7 +689,21 @@ class WebGPUBackend extends Backend {
648
689
 
649
690
  if ( renderContext.clearColor ) {
650
691
 
651
- 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
+
652
707
  colorAttachment.loadOp = GPULoadOp.Clear;
653
708
 
654
709
  } else {
@@ -1190,7 +1245,6 @@ class WebGPUBackend extends Backend {
1190
1245
 
1191
1246
  let colorAttachments = [];
1192
1247
  let depthStencilAttachment;
1193
- let clearValue;
1194
1248
 
1195
1249
  let supportsDepth;
1196
1250
  let supportsStencil;
@@ -1198,7 +1252,11 @@ class WebGPUBackend extends Backend {
1198
1252
  if ( color ) {
1199
1253
 
1200
1254
  const clearColor = this.getClearColor();
1201
- 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;
1202
1260
 
1203
1261
  }
1204
1262
 
@@ -1215,7 +1273,7 @@ class WebGPUBackend extends Backend {
1215
1273
 
1216
1274
  const colorAttachment = colorAttachments[ 0 ];
1217
1275
 
1218
- colorAttachment.clearValue = clearValue;
1276
+ colorAttachment.clearValue = _clearValue;
1219
1277
  colorAttachment.loadOp = GPULoadOp.Clear;
1220
1278
  colorAttachment.storeOp = GPUStoreOp.Store;
1221
1279
 
@@ -1234,7 +1292,7 @@ class WebGPUBackend extends Backend {
1234
1292
 
1235
1293
  const clearConfig = {
1236
1294
  loadOp: color ? GPULoadOp.Clear : GPULoadOp.Load,
1237
- clearValue: color ? clearValue : undefined
1295
+ clearValue: color ? _clearValue : undefined
1238
1296
  };
1239
1297
 
1240
1298
  if ( supportsDepth ) {
@@ -1372,13 +1430,13 @@ class WebGPUBackend extends Backend {
1372
1430
 
1373
1431
  if ( dispatchSize === null ) {
1374
1432
 
1375
- dispatchSize = computeNode.count;
1433
+ dispatchSize = computeNode.dispatchSize || computeNode.count;
1376
1434
 
1377
1435
  }
1378
1436
 
1379
1437
  // When the dispatchSize is set with a StorageBuffer from the GPU.
1380
1438
 
1381
- if ( dispatchSize && typeof dispatchSize === 'object' && dispatchSize.isIndirectStorageBufferAttribute ) {
1439
+ if ( dispatchSize && dispatchSize.isIndirectStorageBufferAttribute ) {
1382
1440
 
1383
1441
  const dispatchBuffer = this.get( dispatchSize ).buffer;
1384
1442
 
@@ -1457,183 +1515,201 @@ class WebGPUBackend extends Backend {
1457
1515
 
1458
1516
  }
1459
1517
 
1460
- // render object
1461
-
1462
1518
  /**
1463
- * Executes a draw command for the given render object.
1519
+ * Internal draw function that performs the draw with the given pass encoder.
1464
1520
  *
1465
- * @param {RenderObject} renderObject - The render object to draw.
1521
+ * @private
1522
+ * @param {RenderObject} renderObject - The render object.
1466
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.
1467
1531
  */
1468
- draw( renderObject, info ) {
1532
+ _draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, passEncoderGPU, currentSets ) {
1469
1533
 
1470
- const { object, material, context, pipeline } = renderObject;
1471
- const bindings = renderObject.getBindings();
1472
- const renderContextData = this.get( context );
1473
- const pipelineData = this.get( pipeline );
1474
- const pipelineGPU = pipelineData.pipeline;
1475
-
1476
- if ( pipelineData.error === true ) return;
1534
+ const { object, material, context } = renderObject;
1477
1535
 
1478
1536
  const index = renderObject.getIndex();
1479
1537
  const hasIndex = ( index !== null );
1480
1538
 
1481
-
1482
- const drawParams = renderObject.getDrawParameters();
1483
- if ( drawParams === null ) return;
1484
-
1485
1539
  // pipeline
1540
+ this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
1541
+ currentSets.pipeline = pipelineGPU;
1486
1542
 
1487
- const setPipelineAndBindings = ( passEncoderGPU, currentSets ) => {
1543
+ // bind groups
1544
+ const currentBindingGroups = currentSets.bindingGroups;
1545
+ for ( let i = 0, l = bindings.length; i < l; i ++ ) {
1488
1546
 
1489
- // pipeline
1490
- this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
1491
- currentSets.pipeline = pipelineGPU;
1547
+ const bindGroup = bindings[ i ];
1548
+ const bindingsData = this.get( bindGroup );
1549
+ if ( currentBindingGroups[ i ] !== bindGroup.id ) {
1492
1550
 
1493
- // bind groups
1494
- const currentBindingGroups = currentSets.bindingGroups;
1495
- for ( let i = 0, l = bindings.length; i < l; i ++ ) {
1551
+ passEncoderGPU.setBindGroup( i, bindingsData.group );
1552
+ currentBindingGroups[ i ] = bindGroup.id;
1496
1553
 
1497
- const bindGroup = bindings[ i ];
1498
- const bindingsData = this.get( bindGroup );
1499
- if ( currentBindingGroups[ bindGroup.index ] !== bindGroup.id ) {
1554
+ }
1500
1555
 
1501
- passEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group );
1502
- currentBindingGroups[ bindGroup.index ] = bindGroup.id;
1556
+ }
1503
1557
 
1504
- }
1558
+ // attributes
1505
1559
 
1506
- }
1560
+ // index
1507
1561
 
1508
- // attributes
1562
+ if ( hasIndex === true ) {
1509
1563
 
1510
- // index
1564
+ if ( currentSets.index !== index ) {
1511
1565
 
1512
- if ( hasIndex === true ) {
1566
+ const buffer = this.get( index ).buffer;
1567
+ const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
1513
1568
 
1514
- if ( currentSets.index !== index ) {
1569
+ passEncoderGPU.setIndexBuffer( buffer, indexFormat );
1515
1570
 
1516
- const buffer = this.get( index ).buffer;
1517
- const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
1571
+ currentSets.index = index;
1518
1572
 
1519
- passEncoderGPU.setIndexBuffer( buffer, indexFormat );
1573
+ }
1520
1574
 
1521
- currentSets.index = index;
1575
+ }
1522
1576
 
1523
- }
1577
+ for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {
1524
1578
 
1525
- }
1526
- // vertex buffers
1579
+ const vertexBuffer = vertexBuffers[ i ];
1527
1580
 
1528
- const vertexBuffers = renderObject.getVertexBuffers();
1581
+ if ( currentSets.attributes[ i ] !== vertexBuffer ) {
1529
1582
 
1530
- for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {
1583
+ const buffer = this.get( vertexBuffer ).buffer;
1584
+ passEncoderGPU.setVertexBuffer( i, buffer );
1531
1585
 
1532
- const vertexBuffer = vertexBuffers[ i ];
1586
+ currentSets.attributes[ i ] = vertexBuffer;
1533
1587
 
1534
- if ( currentSets.attributes[ i ] !== vertexBuffer ) {
1588
+ }
1535
1589
 
1536
- const buffer = this.get( vertexBuffer ).buffer;
1537
- passEncoderGPU.setVertexBuffer( i, buffer );
1590
+ }
1591
+ // stencil
1538
1592
 
1539
- currentSets.attributes[ i ] = vertexBuffer;
1593
+ if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {
1540
1594
 
1541
- }
1595
+ passEncoderGPU.setStencilReference( material.stencilRef );
1596
+ renderContextData.currentStencilRef = material.stencilRef;
1542
1597
 
1543
- }
1544
- // stencil
1598
+ }
1545
1599
 
1546
- if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {
1600
+ if ( object.isBatchedMesh === true ) {
1547
1601
 
1548
- passEncoderGPU.setStencilReference( material.stencilRef );
1549
- renderContextData.currentStencilRef = material.stencilRef;
1602
+ const starts = object._multiDrawStarts;
1603
+ const counts = object._multiDrawCounts;
1604
+ const drawCount = object._multiDrawCount;
1550
1605
 
1551
- }
1606
+ let bytesPerElement = ( hasIndex === true ) ? index.array.BYTES_PER_ELEMENT : 1;
1552
1607
 
1608
+ if ( material.wireframe ) {
1553
1609
 
1554
- };
1610
+ bytesPerElement = object.geometry.attributes.position.count > 65535 ? 4 : 2;
1555
1611
 
1556
- // Define draw function
1557
- const draw = ( passEncoderGPU, currentSets ) => {
1612
+ }
1558
1613
 
1559
- setPipelineAndBindings( passEncoderGPU, currentSets );
1614
+ for ( let i = 0; i < drawCount; i ++ ) {
1560
1615
 
1561
- if ( object.isBatchedMesh === true ) {
1616
+ if ( hasIndex === true ) {
1562
1617
 
1563
- const starts = object._multiDrawStarts;
1564
- const counts = object._multiDrawCounts;
1565
- const drawCount = object._multiDrawCount;
1566
- const drawInstances = object._multiDrawInstances;
1618
+ passEncoderGPU.drawIndexed( counts[ i ], 1, starts[ i ] / bytesPerElement, 0, i );
1567
1619
 
1568
- if ( drawInstances !== null ) {
1620
+ } else {
1569
1621
 
1570
- // @deprecated, r174
1571
- warnOnce( '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 );
1572
1623
 
1573
1624
  }
1574
1625
 
1575
- for ( let i = 0; i < drawCount; i ++ ) {
1626
+ info.update( object, counts[ i ], 1 );
1576
1627
 
1577
- const count = drawInstances ? drawInstances[ i ] : 1;
1578
- const firstInstance = count > 1 ? 0 : i;
1628
+ }
1579
1629
 
1580
- if ( hasIndex === true ) {
1630
+ } else if ( hasIndex === true ) {
1581
1631
 
1582
- passEncoderGPU.drawIndexed( counts[ i ], count, starts[ i ] / index.array.BYTES_PER_ELEMENT, 0, firstInstance );
1632
+ const { vertexCount: indexCount, instanceCount, firstVertex: firstIndex } = drawParams;
1583
1633
 
1584
- } else {
1634
+ const indirect = renderObject.getIndirect();
1585
1635
 
1586
- passEncoderGPU.draw( counts[ i ], count, starts[ i ], firstInstance );
1636
+ if ( indirect !== null ) {
1587
1637
 
1588
- }
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 ++ ) {
1589
1643
 
1590
- info.update( object, counts[ i ], count );
1644
+ passEncoderGPU.drawIndexedIndirect( buffer, indirectOffsets[ i ] );
1591
1645
 
1592
1646
  }
1593
1647
 
1594
- } else if ( hasIndex === true ) {
1648
+ } else {
1595
1649
 
1596
- const { vertexCount: indexCount, instanceCount, firstVertex: firstIndex } = drawParams;
1650
+ passEncoderGPU.drawIndexed( indexCount, instanceCount, firstIndex, 0, 0 );
1597
1651
 
1598
- const indirect = renderObject.getIndirect();
1652
+ }
1599
1653
 
1600
- if ( indirect !== null ) {
1654
+ info.update( object, indexCount, instanceCount );
1601
1655
 
1602
- const buffer = this.get( indirect ).buffer;
1656
+ } else {
1603
1657
 
1604
- passEncoderGPU.drawIndexedIndirect( buffer, 0 );
1658
+ const { vertexCount, instanceCount, firstVertex } = drawParams;
1605
1659
 
1606
- } else {
1660
+ const indirect = renderObject.getIndirect();
1607
1661
 
1608
- passEncoderGPU.drawIndexed( indexCount, instanceCount, firstIndex, 0, 0 );
1662
+ if ( indirect !== null ) {
1663
+
1664
+ const buffer = this.get( indirect ).buffer;
1665
+ const indirectOffset = renderObject.getIndirectOffset();
1666
+ const indirectOffsets = Array.isArray( indirectOffset ) ? indirectOffset : [ indirectOffset ];
1667
+
1668
+ for ( let i = 0; i < indirectOffsets.length; i ++ ) {
1669
+
1670
+ passEncoderGPU.drawIndirect( buffer, indirectOffsets[ i ] );
1609
1671
 
1610
1672
  }
1611
1673
 
1612
- info.update( object, indexCount, instanceCount );
1613
1674
 
1614
1675
  } else {
1615
1676
 
1616
- const { vertexCount, instanceCount, firstVertex } = drawParams;
1677
+ passEncoderGPU.draw( vertexCount, instanceCount, firstVertex, 0 );
1678
+
1679
+ }
1617
1680
 
1618
- const indirect = renderObject.getIndirect();
1681
+ info.update( object, vertexCount, instanceCount );
1619
1682
 
1620
- if ( indirect !== null ) {
1683
+ }
1621
1684
 
1622
- const buffer = this.get( indirect ).buffer;
1685
+ }
1623
1686
 
1624
- passEncoderGPU.drawIndirect( buffer, 0 );
1687
+ // render object
1625
1688
 
1626
- } else {
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 ) {
1627
1696
 
1628
- passEncoderGPU.draw( vertexCount, instanceCount, firstVertex, 0 );
1697
+ const { object, context, pipeline } = renderObject;
1698
+ const renderContextData = this.get( context );
1699
+ const pipelineData = this.get( pipeline );
1700
+ const pipelineGPU = pipelineData.pipeline;
1629
1701
 
1630
- }
1702
+ // Skip if pipeline has error
1703
+ if ( pipelineData.error === true ) return;
1631
1704
 
1632
- info.update( object, vertexCount, instanceCount );
1705
+ const drawParams = renderObject.getDrawParameters();
1706
+ if ( drawParams === null ) return;
1633
1707
 
1634
- }
1708
+ const bindings = renderObject.getBindings();
1635
1709
 
1636
- };
1710
+ // vertex buffers
1711
+
1712
+ const vertexBuffers = renderObject.getVertexBuffers();
1637
1713
 
1638
1714
  if ( renderObject.camera.isArrayCamera && renderObject.camera.cameras.length > 0 ) {
1639
1715
 
@@ -1652,7 +1728,9 @@ class WebGPUBackend extends Backend {
1652
1728
 
1653
1729
  data[ 0 ] = i;
1654
1730
 
1655
- const bindGroupIndex = this.bindingUtils.createBindGroupIndex( data, bindingsData.layout );
1731
+ const { layoutGPU } = bindingsData.layout;
1732
+
1733
+ const bindGroupIndex = this.bindingUtils.createBindGroupIndex( data, layoutGPU );
1656
1734
 
1657
1735
  indexesGPU.push( bindGroupIndex );
1658
1736
 
@@ -1672,8 +1750,6 @@ class WebGPUBackend extends Backend {
1672
1750
 
1673
1751
  const vp = subCamera.viewport;
1674
1752
 
1675
-
1676
-
1677
1753
  let pass = renderContextData.currentPass;
1678
1754
  let sets = renderContextData.currentSets;
1679
1755
  if ( renderContextData.bundleEncoders ) {
@@ -1685,8 +1761,6 @@ class WebGPUBackend extends Backend {
1685
1761
 
1686
1762
  }
1687
1763
 
1688
-
1689
-
1690
1764
  if ( vp ) {
1691
1765
 
1692
1766
  pass.setViewport(
@@ -1700,17 +1774,16 @@ class WebGPUBackend extends Backend {
1700
1774
 
1701
1775
  }
1702
1776
 
1703
-
1704
1777
  // Set camera index binding for this layer
1705
1778
  if ( cameraIndex && cameraData.indexesGPU ) {
1706
1779
 
1707
- pass.setBindGroup( cameraIndex.index, cameraData.indexesGPU[ i ] );
1708
- 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;
1709
1783
 
1710
1784
  }
1711
1785
 
1712
- draw( pass, sets );
1713
-
1786
+ this._draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, pass, sets );
1714
1787
 
1715
1788
  }
1716
1789
 
@@ -1747,7 +1820,7 @@ class WebGPUBackend extends Backend {
1747
1820
 
1748
1821
  }
1749
1822
 
1750
- draw( renderContextData.currentPass, renderContextData.currentSets );
1823
+ this._draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, renderContextData.currentPass, renderContextData.currentSets );
1751
1824
 
1752
1825
  }
1753
1826
 
@@ -2144,6 +2217,17 @@ class WebGPUBackend extends Backend {
2144
2217
 
2145
2218
  }
2146
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
+
2147
2231
  // attributes
2148
2232
 
2149
2233
  /**
@@ -2233,17 +2317,6 @@ class WebGPUBackend extends Backend {
2233
2317
 
2234
2318
  // utils public
2235
2319
 
2236
- /**
2237
- * Returns the maximum anisotropy texture filtering value.
2238
- *
2239
- * @return {number} The maximum anisotropy texture filtering value.
2240
- */
2241
- getMaxAnisotropy() {
2242
-
2243
- return 16;
2244
-
2245
- }
2246
-
2247
2320
  /**
2248
2321
  * Checks if the given feature is supported by the backend.
2249
2322
  *
@@ -2471,10 +2544,57 @@ class WebGPUBackend extends Backend {
2471
2544
 
2472
2545
  }
2473
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
+
2474
2565
  dispose() {
2475
2566
 
2567
+ this.bindingUtils.dispose();
2476
2568
  this.textureUtils.dispose();
2477
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 ) {
2593
+
2594
+ this.device.destroy();
2595
+
2596
+ }
2597
+
2478
2598
  }
2479
2599
 
2480
2600
  }