super-three 0.177.0 → 0.181.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +1994 -749
  3. package/build/three.core.js +1358 -506
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +631 -247
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +113 -33
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +9571 -3424
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +9397 -3426
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  14. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  15. package/examples/jsm/Addons.js +2 -3
  16. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  17. package/examples/jsm/capabilities/WebGL.js +0 -27
  18. package/examples/jsm/capabilities/WebGPU.js +1 -1
  19. package/examples/jsm/controls/ArcballControls.js +9 -9
  20. package/examples/jsm/controls/DragControls.js +7 -57
  21. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  22. package/examples/jsm/controls/FlyControls.js +1 -1
  23. package/examples/jsm/controls/OrbitControls.js +2 -2
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +1 -1
  26. package/examples/jsm/controls/TransformControls.js +62 -15
  27. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  28. package/examples/jsm/effects/AsciiEffect.js +8 -8
  29. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  30. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  31. package/examples/jsm/exporters/EXRExporter.js +1 -1
  32. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  33. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  34. package/examples/jsm/exporters/PLYExporter.js +1 -1
  35. package/examples/jsm/exporters/USDZExporter.js +683 -299
  36. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  37. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  38. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  39. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  40. package/examples/jsm/geometries/TextGeometry.js +3 -2
  41. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  42. package/examples/jsm/helpers/ViewHelper.js +43 -5
  43. package/examples/jsm/inspector/Inspector.js +427 -0
  44. package/examples/jsm/inspector/RendererInspector.js +415 -0
  45. package/examples/jsm/inspector/tabs/Console.js +204 -0
  46. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  47. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  48. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  49. package/examples/jsm/inspector/ui/Graph.js +95 -0
  50. package/examples/jsm/inspector/ui/Item.js +170 -0
  51. package/examples/jsm/inspector/ui/List.js +75 -0
  52. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  53. package/examples/jsm/inspector/ui/Style.js +654 -0
  54. package/examples/jsm/inspector/ui/Tab.js +46 -0
  55. package/examples/jsm/inspector/ui/Values.js +423 -0
  56. package/examples/jsm/inspector/ui/utils.js +56 -0
  57. package/examples/jsm/interactive/HTMLMesh.js +11 -13
  58. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  59. package/examples/jsm/interactive/SelectionBox.js +30 -0
  60. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  61. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  62. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  63. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  64. package/examples/jsm/lines/Line2.js +3 -3
  65. package/examples/jsm/lines/LineGeometry.js +1 -1
  66. package/examples/jsm/lines/LineSegments2.js +2 -2
  67. package/examples/jsm/lines/Wireframe.js +2 -2
  68. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  69. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  70. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  71. package/examples/jsm/loaders/3MFLoader.js +1 -1
  72. package/examples/jsm/loaders/ColladaLoader.js +4 -4
  73. package/examples/jsm/loaders/DDSLoader.js +1 -1
  74. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  75. package/examples/jsm/loaders/EXRLoader.js +210 -22
  76. package/examples/jsm/loaders/FBXLoader.js +4 -4
  77. package/examples/jsm/loaders/FontLoader.js +23 -5
  78. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  79. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  80. package/examples/jsm/loaders/HDRLoader.js +486 -0
  81. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  82. package/examples/jsm/loaders/KTXLoader.js +2 -2
  83. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  84. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  85. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  86. package/examples/jsm/loaders/LWOLoader.js +2 -2
  87. package/examples/jsm/loaders/MaterialXLoader.js +233 -34
  88. package/examples/jsm/loaders/OBJLoader.js +1 -1
  89. package/examples/jsm/loaders/PDBLoader.js +1 -1
  90. package/examples/jsm/loaders/RGBELoader.js +7 -473
  91. package/examples/jsm/loaders/SVGLoader.js +2 -2
  92. package/examples/jsm/loaders/TTFLoader.js +13 -1
  93. package/examples/jsm/loaders/USDLoader.js +219 -0
  94. package/examples/jsm/loaders/USDZLoader.js +4 -892
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  96. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  97. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  98. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  99. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  100. package/examples/jsm/math/ColorSpaces.js +19 -1
  101. package/examples/jsm/math/ConvexHull.js +3 -3
  102. package/examples/jsm/math/ImprovedNoise.js +1 -1
  103. package/examples/jsm/math/Lut.js +2 -2
  104. package/examples/jsm/math/SimplexNoise.js +1 -1
  105. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  106. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  107. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  108. package/examples/jsm/misc/TubePainter.js +383 -40
  109. package/examples/jsm/misc/Volume.js +1 -1
  110. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  111. package/examples/jsm/objects/LensflareMesh.js +3 -3
  112. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  113. package/examples/jsm/objects/Sky.js +1 -1
  114. package/examples/jsm/objects/SkyMesh.js +3 -3
  115. package/examples/jsm/objects/Water.js +3 -3
  116. package/examples/jsm/objects/WaterMesh.js +6 -6
  117. package/examples/jsm/physics/RapierPhysics.js +95 -16
  118. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  119. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  120. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  121. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  122. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  123. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  124. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  125. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  126. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  127. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  128. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  129. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  130. package/examples/jsm/shaders/BokehShader.js +1 -1
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  133. package/examples/jsm/shaders/FocusShader.js +1 -1
  134. package/examples/jsm/shaders/GTAOShader.js +2 -2
  135. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  136. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  137. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  138. package/examples/jsm/shaders/SSRShader.js +1 -1
  139. package/examples/jsm/shaders/SepiaShader.js +1 -1
  140. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  141. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  142. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  143. package/examples/jsm/shaders/VignetteShader.js +1 -1
  144. package/examples/jsm/transpiler/AST.js +381 -30
  145. package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
  146. package/examples/jsm/transpiler/Linker.js +327 -0
  147. package/examples/jsm/transpiler/TSLEncoder.js +196 -92
  148. package/examples/jsm/transpiler/Transpiler.js +17 -1
  149. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  150. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  151. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  152. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  153. package/examples/jsm/tsl/display/BloomNode.js +11 -6
  154. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  155. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  156. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  157. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  158. package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
  159. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  160. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  161. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  162. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  163. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  164. package/examples/jsm/tsl/display/TRAANode.js +578 -0
  165. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  166. package/examples/jsm/tsl/display/hashBlur.js +18 -20
  167. package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
  168. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  169. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  170. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  171. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  172. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  173. package/package.json +5 -10
  174. package/src/Three.Core.js +5 -2
  175. package/src/Three.TSL.js +112 -32
  176. package/src/Three.WebGPU.Nodes.js +2 -0
  177. package/src/Three.WebGPU.js +4 -0
  178. package/src/animation/AnimationClip.js +20 -4
  179. package/src/animation/AnimationMixer.js +3 -3
  180. package/src/animation/AnimationObjectGroup.js +2 -1
  181. package/src/animation/KeyframeTrack.js +8 -7
  182. package/src/animation/PropertyBinding.js +12 -11
  183. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  184. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  185. package/src/audio/Audio.js +10 -9
  186. package/src/audio/PositionalAudio.js +1 -1
  187. package/src/cameras/Camera.js +14 -0
  188. package/src/cameras/OrthographicCamera.js +2 -2
  189. package/src/cameras/PerspectiveCamera.js +2 -2
  190. package/src/cameras/StereoCamera.js +2 -2
  191. package/src/constants.js +13 -5
  192. package/src/core/BufferAttribute.js +3 -3
  193. package/src/core/BufferGeometry.js +10 -10
  194. package/src/core/Clock.js +2 -8
  195. package/src/core/EventDispatcher.js +1 -1
  196. package/src/core/GLBufferAttribute.js +13 -1
  197. package/src/core/InterleavedBuffer.js +1 -1
  198. package/src/core/InterleavedBufferAttribute.js +3 -2
  199. package/src/core/Object3D.js +4 -3
  200. package/src/core/Raycaster.js +2 -1
  201. package/src/core/RenderTarget.js +10 -1
  202. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  203. package/src/extras/Controls.js +5 -4
  204. package/src/extras/DataUtils.js +2 -1
  205. package/src/extras/Earcut.js +6 -0
  206. package/src/extras/ImageUtils.js +2 -2
  207. package/src/extras/PMREMGenerator.js +279 -55
  208. package/src/extras/TextureUtils.js +2 -1
  209. package/src/extras/core/Curve.js +2 -1
  210. package/src/extras/core/Interpolations.js +7 -1
  211. package/src/extras/core/Path.js +22 -22
  212. package/src/extras/core/ShapePath.js +4 -4
  213. package/src/extras/lib/earcut.js +8 -8
  214. package/src/geometries/BoxGeometry.js +1 -0
  215. package/src/geometries/CapsuleGeometry.js +1 -0
  216. package/src/geometries/CircleGeometry.js +1 -0
  217. package/src/geometries/ConeGeometry.js +1 -0
  218. package/src/geometries/CylinderGeometry.js +1 -0
  219. package/src/geometries/DodecahedronGeometry.js +1 -0
  220. package/src/geometries/ExtrudeGeometry.js +8 -6
  221. package/src/geometries/IcosahedronGeometry.js +1 -0
  222. package/src/geometries/LatheGeometry.js +1 -0
  223. package/src/geometries/OctahedronGeometry.js +1 -0
  224. package/src/geometries/PlaneGeometry.js +1 -0
  225. package/src/geometries/RingGeometry.js +1 -0
  226. package/src/geometries/ShapeGeometry.js +1 -0
  227. package/src/geometries/SphereGeometry.js +1 -0
  228. package/src/geometries/TetrahedronGeometry.js +1 -0
  229. package/src/geometries/TorusGeometry.js +1 -0
  230. package/src/geometries/TorusKnotGeometry.js +1 -0
  231. package/src/geometries/TubeGeometry.js +1 -0
  232. package/src/helpers/CameraHelper.js +42 -12
  233. package/src/helpers/SkeletonHelper.js +35 -6
  234. package/src/lights/LightShadow.js +21 -8
  235. package/src/lights/PointLightShadow.js +1 -1
  236. package/src/lights/webgpu/ProjectorLight.js +1 -1
  237. package/src/loaders/AnimationLoader.js +2 -1
  238. package/src/loaders/AudioLoader.js +2 -1
  239. package/src/loaders/BufferGeometryLoader.js +2 -2
  240. package/src/loaders/Cache.js +2 -2
  241. package/src/loaders/DataTextureLoader.js +1 -1
  242. package/src/loaders/FileLoader.js +29 -5
  243. package/src/loaders/ImageBitmapLoader.js +32 -8
  244. package/src/loaders/ImageLoader.js +56 -9
  245. package/src/loaders/Loader.js +17 -3
  246. package/src/loaders/LoadingManager.js +45 -0
  247. package/src/loaders/MaterialLoader.js +3 -2
  248. package/src/loaders/ObjectLoader.js +13 -13
  249. package/src/loaders/TextureLoader.js +1 -1
  250. package/src/loaders/nodes/NodeLoader.js +3 -2
  251. package/src/materials/Material.js +16 -3
  252. package/src/materials/MeshBasicMaterial.js +2 -1
  253. package/src/materials/MeshDepthMaterial.js +1 -0
  254. package/src/materials/MeshDistanceMaterial.js +1 -1
  255. package/src/materials/MeshLambertMaterial.js +2 -1
  256. package/src/materials/MeshMatcapMaterial.js +22 -0
  257. package/src/materials/MeshNormalMaterial.js +1 -0
  258. package/src/materials/MeshPhongMaterial.js +2 -1
  259. package/src/materials/MeshPhysicalMaterial.js +2 -1
  260. package/src/materials/MeshStandardMaterial.js +8 -7
  261. package/src/materials/MeshToonMaterial.js +1 -0
  262. package/src/materials/PointsMaterial.js +1 -1
  263. package/src/materials/ShaderMaterial.js +2 -2
  264. package/src/materials/nodes/Line2NodeMaterial.js +2 -10
  265. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  266. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  267. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  268. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  269. package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
  270. package/src/materials/nodes/NodeMaterial.js +90 -27
  271. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  272. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  273. package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
  274. package/src/math/Color.js +6 -5
  275. package/src/math/ColorManagement.js +9 -3
  276. package/src/math/Cylindrical.js +1 -1
  277. package/src/math/Euler.js +2 -1
  278. package/src/math/Frustum.js +25 -9
  279. package/src/math/FrustumArray.js +10 -5
  280. package/src/math/Line3.js +129 -2
  281. package/src/math/MathUtils.js +13 -11
  282. package/src/math/Matrix2.js +1 -1
  283. package/src/math/Matrix3.js +2 -2
  284. package/src/math/Matrix4.js +55 -34
  285. package/src/math/Plane.js +1 -1
  286. package/src/math/Quaternion.js +69 -67
  287. package/src/math/Spherical.js +3 -3
  288. package/src/nodes/Nodes.js +6 -4
  289. package/src/nodes/TSL.js +9 -4
  290. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  291. package/src/nodes/accessors/Bitangent.js +31 -25
  292. package/src/nodes/accessors/BufferNode.js +1 -1
  293. package/src/nodes/accessors/Camera.js +142 -16
  294. package/src/nodes/accessors/ClippingNode.js +6 -5
  295. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  296. package/src/nodes/accessors/InstanceNode.js +25 -5
  297. package/src/nodes/accessors/Lights.js +10 -0
  298. package/src/nodes/accessors/Normal.js +97 -30
  299. package/src/nodes/accessors/Object3DNode.js +2 -2
  300. package/src/nodes/accessors/Position.js +25 -9
  301. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  302. package/src/nodes/accessors/ReferenceNode.js +20 -4
  303. package/src/nodes/accessors/ReflectVector.js +3 -3
  304. package/src/nodes/accessors/SceneNode.js +3 -2
  305. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  306. package/src/nodes/accessors/StorageTextureNode.js +23 -1
  307. package/src/nodes/accessors/Tangent.js +25 -17
  308. package/src/nodes/accessors/TangentUtils.js +46 -0
  309. package/src/nodes/accessors/Texture3DNode.js +14 -1
  310. package/src/nodes/accessors/TextureBicubic.js +21 -3
  311. package/src/nodes/accessors/TextureNode.js +142 -44
  312. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  313. package/src/nodes/code/FunctionCallNode.js +24 -4
  314. package/src/nodes/code/FunctionNode.js +23 -0
  315. package/src/nodes/core/ArrayNode.js +13 -0
  316. package/src/nodes/core/AssignNode.js +6 -2
  317. package/src/nodes/core/AttributeNode.js +2 -1
  318. package/src/nodes/core/ContextNode.js +48 -10
  319. package/src/nodes/core/IndexNode.js +2 -2
  320. package/src/nodes/core/InputNode.js +2 -1
  321. package/src/nodes/core/InspectorNode.js +128 -0
  322. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
  323. package/src/nodes/core/Node.js +167 -34
  324. package/src/nodes/core/NodeBuilder.js +404 -120
  325. package/src/nodes/core/NodeFrame.js +21 -21
  326. package/src/nodes/core/NodeFunction.js +2 -1
  327. package/src/nodes/core/NodeParser.js +2 -1
  328. package/src/nodes/core/NodeUniform.js +1 -1
  329. package/src/nodes/core/NodeUtils.js +17 -88
  330. package/src/nodes/core/ParameterNode.js +31 -0
  331. package/src/nodes/core/PropertyNode.js +7 -0
  332. package/src/nodes/core/StackNode.js +77 -30
  333. package/src/nodes/core/StructNode.js +5 -5
  334. package/src/nodes/core/StructTypeNode.js +1 -0
  335. package/src/nodes/core/SubBuildNode.js +89 -0
  336. package/src/nodes/core/UniformNode.js +80 -14
  337. package/src/nodes/core/VarNode.js +142 -16
  338. package/src/nodes/core/VaryingNode.js +9 -6
  339. package/src/nodes/display/BlendModes.js +7 -6
  340. package/src/nodes/display/BumpMapNode.js +1 -1
  341. package/src/nodes/display/ColorAdjustment.js +1 -1
  342. package/src/nodes/display/FrontFacingNode.js +35 -7
  343. package/src/nodes/display/NormalMapNode.js +20 -50
  344. package/src/nodes/display/PassNode.js +206 -17
  345. package/src/nodes/display/RenderOutputNode.js +28 -2
  346. package/src/nodes/display/ScreenNode.js +44 -40
  347. package/src/nodes/display/ToneMappingNode.js +31 -4
  348. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  349. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  350. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  351. package/src/nodes/display/ViewportTextureNode.js +94 -4
  352. package/src/nodes/fog/Fog.js +3 -2
  353. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  354. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  355. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  356. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  357. package/src/nodes/functions/BasicLightingModel.js +2 -1
  358. package/src/nodes/functions/PhongLightingModel.js +3 -3
  359. package/src/nodes/functions/PhysicalLightingModel.js +19 -18
  360. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  361. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  362. package/src/nodes/geometry/RangeNode.js +40 -4
  363. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  364. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  365. package/src/nodes/gpgpu/ComputeNode.js +81 -25
  366. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  367. package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
  368. package/src/nodes/lighting/EnvironmentNode.js +11 -11
  369. package/src/nodes/lighting/LightsNode.js +7 -8
  370. package/src/nodes/lighting/PointShadowNode.js +6 -0
  371. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  372. package/src/nodes/lighting/ShadowFilterNode.js +3 -1
  373. package/src/nodes/lighting/ShadowNode.js +77 -10
  374. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  375. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  376. package/src/nodes/math/BitcastNode.js +156 -0
  377. package/src/nodes/math/ConditionalNode.js +25 -27
  378. package/src/nodes/math/MathNode.js +106 -65
  379. package/src/nodes/math/OperatorNode.js +28 -43
  380. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  381. package/src/nodes/shapes/Shapes.js +1 -1
  382. package/src/nodes/tsl/TSLBase.js +6 -2
  383. package/src/nodes/tsl/TSLCore.js +546 -186
  384. package/src/nodes/utils/DebugNode.js +3 -2
  385. package/src/nodes/utils/EquirectUV.js +27 -0
  386. package/src/nodes/utils/EventNode.js +119 -0
  387. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  388. package/src/nodes/utils/JoinNode.js +6 -3
  389. package/src/nodes/utils/LoopNode.js +20 -41
  390. package/src/nodes/utils/MatcapUV.js +22 -0
  391. package/src/nodes/utils/MemberNode.js +59 -7
  392. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  393. package/src/nodes/utils/RTTNode.js +33 -6
  394. package/src/nodes/utils/ReflectorNode.js +68 -10
  395. package/src/nodes/utils/SampleNode.js +91 -0
  396. package/src/nodes/utils/SplitNode.js +11 -0
  397. package/src/nodes/utils/Timer.js +0 -47
  398. package/src/nodes/utils/TriplanarTextures.js +65 -0
  399. package/src/objects/BatchedMesh.js +6 -4
  400. package/src/objects/LOD.js +1 -1
  401. package/src/objects/Line.js +2 -1
  402. package/src/objects/LineSegments.js +2 -1
  403. package/src/objects/Skeleton.js +3 -2
  404. package/src/objects/SkinnedMesh.js +3 -1
  405. package/src/objects/Sprite.js +4 -3
  406. package/src/renderers/WebGLRenderer.js +77 -66
  407. package/src/renderers/common/Animation.js +13 -1
  408. package/src/renderers/common/Attributes.js +1 -1
  409. package/src/renderers/common/Backend.js +108 -27
  410. package/src/renderers/common/Background.js +4 -3
  411. package/src/renderers/common/Bindings.js +76 -19
  412. package/src/renderers/common/CanvasTarget.js +341 -0
  413. package/src/renderers/common/ChainMap.js +1 -1
  414. package/src/renderers/common/Color4.js +2 -2
  415. package/src/renderers/common/CubeRenderTarget.js +1 -1
  416. package/src/renderers/common/DataMap.js +1 -1
  417. package/src/renderers/common/Geometries.js +26 -0
  418. package/src/renderers/common/Info.js +4 -2
  419. package/src/renderers/common/InspectorBase.js +146 -0
  420. package/src/renderers/common/Pipelines.js +1 -1
  421. package/src/renderers/common/PostProcessing.js +61 -25
  422. package/src/renderers/common/QuadMesh.js +7 -1
  423. package/src/renderers/common/RenderContext.js +2 -2
  424. package/src/renderers/common/RenderList.js +7 -3
  425. package/src/renderers/common/RenderObject.js +84 -5
  426. package/src/renderers/common/RenderObjects.js +1 -1
  427. package/src/renderers/common/Renderer.js +486 -255
  428. package/src/renderers/common/RendererUtils.js +9 -0
  429. package/src/renderers/common/SampledTexture.js +8 -68
  430. package/src/renderers/common/Sampler.js +117 -0
  431. package/src/renderers/common/Storage3DTexture.js +100 -0
  432. package/src/renderers/common/StorageArrayTexture.js +84 -0
  433. package/src/renderers/common/StorageTexture.js +27 -0
  434. package/src/renderers/common/Textures.js +138 -46
  435. package/src/renderers/common/TimestampQueryPool.js +65 -3
  436. package/src/renderers/common/UniformsGroup.js +2 -1
  437. package/src/renderers/common/XRManager.js +63 -24
  438. package/src/renderers/common/XRRenderTarget.js +21 -4
  439. package/src/renderers/common/extras/PMREMGenerator.js +161 -66
  440. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  441. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  442. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  443. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  444. package/src/renderers/common/nodes/Nodes.js +38 -16
  445. package/src/renderers/shaders/DFGLUTData.js +64 -0
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  447. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  450. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  451. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  454. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  455. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  456. package/src/renderers/shaders/UniformsLib.js +1 -0
  457. package/src/renderers/shaders/UniformsUtils.js +25 -4
  458. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  459. package/src/renderers/webgl/WebGLCapabilities.js +4 -3
  460. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  461. package/src/renderers/webgl/WebGLInfo.js +3 -1
  462. package/src/renderers/webgl/WebGLProgram.js +25 -18
  463. package/src/renderers/webgl/WebGLPrograms.js +9 -6
  464. package/src/renderers/webgl/WebGLShadowMap.js +13 -2
  465. package/src/renderers/webgl/WebGLState.js +17 -16
  466. package/src/renderers/webgl/WebGLTextures.js +38 -21
  467. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  468. package/src/renderers/webgl/WebGLUtils.js +3 -2
  469. package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
  470. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
  471. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  472. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  473. package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
  474. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
  475. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  476. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  477. package/src/renderers/webgpu/WebGPUBackend.js +205 -128
  478. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  479. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  480. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
  481. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
  482. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
  483. package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
  484. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
  485. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  486. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
  487. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  488. package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
  489. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  490. package/src/renderers/webxr/WebXRManager.js +89 -13
  491. package/src/textures/ExternalTexture.js +56 -0
  492. package/src/textures/FramebufferTexture.js +2 -2
  493. package/src/textures/Source.js +14 -3
  494. package/src/textures/Texture.js +3 -2
  495. package/src/textures/VideoTexture.js +29 -2
  496. package/src/utils.js +67 -3
  497. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  498. package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
  499. package/src/nodes/utils/EquirectUVNode.js +0 -65
  500. package/src/nodes/utils/MatcapUVNode.js +0 -49
  501. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -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';
@@ -13,9 +13,9 @@ import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
13
13
  import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
14
14
  import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
15
15
 
16
- import { WebGPUCoordinateSystem } from '../../constants.js';
16
+ import { WebGPUCoordinateSystem, TimestampQuery, REVISION, HalfFloatType } from '../../constants.js';
17
17
  import WebGPUTimestampQueryPool from './utils/WebGPUTimestampQueryPool.js';
18
- import { warnOnce } from '../../utils.js';
18
+ import { warnOnce, error } from '../../utils.js';
19
19
 
20
20
  /**
21
21
  * A backend implementation targeting WebGPU.
@@ -83,22 +83,6 @@ class WebGPUBackend extends Backend {
83
83
  */
84
84
  this.device = null;
85
85
 
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
86
  /**
103
87
  * A reference to the default render pass descriptor.
104
88
  *
@@ -231,26 +215,66 @@ class WebGPUBackend extends Backend {
231
215
 
232
216
  } );
233
217
 
234
- const context = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgpu' );
235
-
236
218
  this.device = device;
237
- this.context = context;
238
-
239
- const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
240
219
 
241
220
  this.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery );
242
221
 
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
222
  this.updateSize();
251
223
 
252
224
  }
253
225
 
226
+ /**
227
+ * A reference to the context.
228
+ *
229
+ * @type {?GPUCanvasContext}
230
+ * @default null
231
+ */
232
+ get context() {
233
+
234
+ const canvasTarget = this.renderer.getCanvasTarget();
235
+ const canvasData = this.get( canvasTarget );
236
+
237
+ let context = canvasData.context;
238
+
239
+ if ( context === undefined ) {
240
+
241
+ const parameters = this.parameters;
242
+
243
+ if ( canvasTarget.isDefaultCanvasTarget === true && parameters.context !== undefined ) {
244
+
245
+ context = parameters.context;
246
+
247
+ } else {
248
+
249
+ context = canvasTarget.domElement.getContext( 'webgpu' );
250
+
251
+ }
252
+
253
+ // OffscreenCanvas does not have setAttribute, see #22811
254
+ if ( 'setAttribute' in canvasTarget.domElement ) canvasTarget.domElement.setAttribute( 'data-engine', `three.js r${ REVISION } webgpu` );
255
+
256
+ const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
257
+
258
+ const toneMappingMode = parameters.outputType === HalfFloatType ? 'extended' : 'standard';
259
+
260
+ context.configure( {
261
+ device: this.device,
262
+ format: this.utils.getPreferredCanvasFormat(),
263
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
264
+ alphaMode: alphaMode,
265
+ toneMapping: {
266
+ mode: toneMappingMode
267
+ }
268
+ } );
269
+
270
+ canvasData.context = context;
271
+
272
+ }
273
+
274
+ return context;
275
+
276
+ }
277
+
254
278
  /**
255
279
  * The coordinate system of the backend.
256
280
  *
@@ -300,19 +324,22 @@ class WebGPUBackend extends Backend {
300
324
  */
301
325
  _getDefaultRenderPassDescriptor() {
302
326
 
303
- let descriptor = this.defaultRenderPassdescriptor;
327
+ const renderer = this.renderer;
328
+ const canvasTarget = renderer.getCanvasTarget();
329
+ const canvasData = this.get( canvasTarget );
330
+ const samples = renderer.currentSamples;
304
331
 
305
- if ( descriptor === null ) {
332
+ let descriptor = canvasData.descriptor;
306
333
 
307
- const renderer = this.renderer;
334
+ if ( descriptor === undefined || canvasData.samples !== samples ) {
308
335
 
309
336
  descriptor = {
310
337
  colorAttachments: [ {
311
338
  view: null
312
- } ],
339
+ } ]
313
340
  };
314
341
 
315
- if ( this.renderer.depth === true || this.renderer.stencil === true ) {
342
+ if ( renderer.depth === true || renderer.stencil === true ) {
316
343
 
317
344
  descriptor.depthStencilAttachment = {
318
345
  view: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView()
@@ -322,9 +349,9 @@ class WebGPUBackend extends Backend {
322
349
 
323
350
  const colorAttachment = descriptor.colorAttachments[ 0 ];
324
351
 
325
- if ( this.renderer.samples > 0 ) {
352
+ if ( samples > 0 ) {
326
353
 
327
- colorAttachment.view = this.colorBuffer.createView();
354
+ colorAttachment.view = this.textureUtils.getColorBuffer().createView();
328
355
 
329
356
  } else {
330
357
 
@@ -332,13 +359,14 @@ class WebGPUBackend extends Backend {
332
359
 
333
360
  }
334
361
 
335
- this.defaultRenderPassdescriptor = descriptor;
362
+ canvasData.descriptor = descriptor;
363
+ canvasData.samples = samples;
336
364
 
337
365
  }
338
366
 
339
367
  const colorAttachment = descriptor.colorAttachments[ 0 ];
340
368
 
341
- if ( this.renderer.samples > 0 ) {
369
+ if ( samples > 0 ) {
342
370
 
343
371
  colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
344
372
 
@@ -384,9 +412,6 @@ class WebGPUBackend extends Backend {
384
412
  if ( descriptors === undefined ||
385
413
  renderTargetData.width !== renderTarget.width ||
386
414
  renderTargetData.height !== renderTarget.height ||
387
- renderTargetData.dimensions !== renderTarget.dimensions ||
388
- renderTargetData.activeMipmapLevel !== renderContext.activeMipmapLevel ||
389
- renderTargetData.activeCubeFace !== renderContext.activeCubeFace ||
390
415
  renderTargetData.samples !== renderTarget.samples
391
416
  ) {
392
417
 
@@ -394,21 +419,6 @@ class WebGPUBackend extends Backend {
394
419
 
395
420
  renderTargetData.descriptors = descriptors;
396
421
 
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
422
  }
413
423
 
414
424
  const cacheKey = renderContext.getCacheKey();
@@ -528,7 +538,6 @@ class WebGPUBackend extends Backend {
528
538
  renderTargetData.samples = renderTarget.samples;
529
539
  renderTargetData.activeMipmapLevel = renderContext.activeMipmapLevel;
530
540
  renderTargetData.activeCubeFace = renderContext.activeCubeFace;
531
- renderTargetData.dimensions = renderTarget.dimensions;
532
541
 
533
542
  }
534
543
 
@@ -581,6 +590,8 @@ class WebGPUBackend extends Backend {
581
590
 
582
591
  const renderContextData = this.get( renderContext );
583
592
 
593
+ //
594
+
584
595
  const device = this.device;
585
596
  const occlusionQueryCount = renderContext.occlusionQueryCount;
586
597
 
@@ -621,7 +632,7 @@ class WebGPUBackend extends Backend {
621
632
 
622
633
  }
623
634
 
624
- this.initTimestampQuery( renderContext, descriptor );
635
+ this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ), descriptor );
625
636
 
626
637
  descriptor.occlusionQuerySet = occlusionQuerySet;
627
638
 
@@ -766,8 +777,7 @@ class WebGPUBackend extends Backend {
766
777
 
767
778
  if ( renderContext.scissor ) {
768
779
 
769
- const { x, y, width, height } = renderContext.scissorValue;
770
- currentPass.setScissorRect( x, y, width, height );
780
+ this.updateScissor( renderContext );
771
781
 
772
782
  }
773
783
 
@@ -1127,6 +1137,20 @@ class WebGPUBackend extends Backend {
1127
1137
 
1128
1138
  }
1129
1139
 
1140
+ /**
1141
+ * Updates the scissor with the values from the given render context.
1142
+ *
1143
+ * @param {RenderContext} renderContext - The render context.
1144
+ */
1145
+ updateScissor( renderContext ) {
1146
+
1147
+ const { currentPass } = this.get( renderContext );
1148
+ const { x, y, width, height } = renderContext.scissorValue;
1149
+
1150
+ currentPass.setScissorRect( x, y, width, height );
1151
+
1152
+ }
1153
+
1130
1154
  /**
1131
1155
  * Returns the clear color and alpha into a single
1132
1156
  * color object.
@@ -1236,7 +1260,7 @@ class WebGPUBackend extends Backend {
1236
1260
 
1237
1261
  }
1238
1262
 
1239
- if ( supportsDepth && depthStencilAttachment && depthStencilAttachment.depthLoadOp === undefined ) {
1263
+ if ( supportsDepth && depthStencilAttachment ) {
1240
1264
 
1241
1265
  if ( depth ) {
1242
1266
 
@@ -1255,7 +1279,7 @@ class WebGPUBackend extends Backend {
1255
1279
 
1256
1280
  //
1257
1281
 
1258
- if ( supportsStencil && depthStencilAttachment && depthStencilAttachment.stencilLoadOp === undefined ) {
1282
+ if ( supportsStencil && depthStencilAttachment ) {
1259
1283
 
1260
1284
  if ( stencil ) {
1261
1285
 
@@ -1298,12 +1322,13 @@ class WebGPUBackend extends Backend {
1298
1322
 
1299
1323
  const groupGPU = this.get( computeGroup );
1300
1324
 
1325
+ //
1301
1326
 
1302
1327
  const descriptor = {
1303
1328
  label: 'computeGroup_' + computeGroup.id
1304
1329
  };
1305
1330
 
1306
- this.initTimestampQuery( computeGroup, descriptor );
1331
+ this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ), descriptor );
1307
1332
 
1308
1333
  groupGPU.cmdEncoderGPU = this.device.createCommandEncoder( { label: 'computeGroup_' + computeGroup.id } );
1309
1334
 
@@ -1318,9 +1343,14 @@ class WebGPUBackend extends Backend {
1318
1343
  * @param {Node} computeNode - The compute node.
1319
1344
  * @param {Array<BindGroup>} bindings - The bindings.
1320
1345
  * @param {ComputePipeline} pipeline - The compute pipeline.
1346
+ * @param {number|Array<number>|IndirectStorageBufferAttribute} [dispatchSize=null]
1347
+ * - A single number representing count, or
1348
+ * - An array [x, y, z] representing dispatch size, or
1349
+ * - A IndirectStorageBufferAttribute for indirect dispatch size.
1321
1350
  */
1322
- compute( computeGroup, computeNode, bindings, pipeline ) {
1351
+ compute( computeGroup, computeNode, bindings, pipeline, dispatchSize = null ) {
1323
1352
 
1353
+ const computeNodeData = this.get( computeNode );
1324
1354
  const { passEncoderGPU } = this.get( computeGroup );
1325
1355
 
1326
1356
  // pipeline
@@ -1340,29 +1370,73 @@ class WebGPUBackend extends Backend {
1340
1370
 
1341
1371
  }
1342
1372
 
1343
- const maxComputeWorkgroupsPerDimension = this.device.limits.maxComputeWorkgroupsPerDimension;
1373
+ if ( dispatchSize === null ) {
1344
1374
 
1345
- const computeNodeData = this.get( computeNode );
1375
+ dispatchSize = computeNode.count;
1346
1376
 
1347
- if ( computeNodeData.dispatchSize === undefined ) computeNodeData.dispatchSize = { x: 0, y: 1, z: 1 };
1377
+ }
1348
1378
 
1349
- const { dispatchSize } = computeNodeData;
1379
+ // When the dispatchSize is set with a StorageBuffer from the GPU.
1350
1380
 
1351
- if ( computeNode.dispatchCount > maxComputeWorkgroupsPerDimension ) {
1381
+ if ( dispatchSize && typeof dispatchSize === 'object' && dispatchSize.isIndirectStorageBufferAttribute ) {
1352
1382
 
1353
- dispatchSize.x = Math.min( computeNode.dispatchCount, maxComputeWorkgroupsPerDimension );
1354
- dispatchSize.y = Math.ceil( computeNode.dispatchCount / maxComputeWorkgroupsPerDimension );
1383
+ const dispatchBuffer = this.get( dispatchSize ).buffer;
1355
1384
 
1356
- } else {
1385
+ passEncoderGPU.dispatchWorkgroupsIndirect( dispatchBuffer, 0 );
1386
+
1387
+ return;
1388
+
1389
+ }
1390
+
1391
+ if ( typeof dispatchSize === 'number' ) {
1392
+
1393
+ // If a single number is given, we calculate the dispatch size based on the workgroup size
1394
+
1395
+ const count = dispatchSize;
1396
+
1397
+ if ( computeNodeData.dispatchSize === undefined || computeNodeData.count !== count ) {
1398
+
1399
+ // cache dispatch size to avoid recalculating it every time
1400
+
1401
+ computeNodeData.dispatchSize = [ 0, 1, 1 ];
1402
+ computeNodeData.count = count;
1403
+
1404
+ const workgroupSize = computeNode.workgroupSize;
1405
+
1406
+ let size = workgroupSize[ 0 ];
1407
+
1408
+ for ( let i = 1; i < workgroupSize.length; i ++ )
1409
+ size *= workgroupSize[ i ];
1410
+
1411
+ const dispatchCount = Math.ceil( count / size );
1412
+
1413
+ //
1357
1414
 
1358
- dispatchSize.x = computeNode.dispatchCount;
1415
+ const maxComputeWorkgroupsPerDimension = this.device.limits.maxComputeWorkgroupsPerDimension;
1416
+
1417
+ dispatchSize = [ dispatchCount, 1, 1 ];
1418
+
1419
+ if ( dispatchCount > maxComputeWorkgroupsPerDimension ) {
1420
+
1421
+ dispatchSize[ 0 ] = Math.min( dispatchCount, maxComputeWorkgroupsPerDimension );
1422
+ dispatchSize[ 1 ] = Math.ceil( dispatchCount / maxComputeWorkgroupsPerDimension );
1423
+
1424
+ }
1425
+
1426
+ computeNodeData.dispatchSize = dispatchSize;
1427
+
1428
+ }
1429
+
1430
+ dispatchSize = computeNodeData.dispatchSize;
1359
1431
 
1360
1432
  }
1361
1433
 
1434
+ //
1435
+
1362
1436
  passEncoderGPU.dispatchWorkgroups(
1363
- dispatchSize.x,
1364
- dispatchSize.y,
1365
- dispatchSize.z
1437
+ dispatchSize[ 0 ],
1438
+ dispatchSize[ 1 ] || 1,
1439
+ dispatchSize[ 2 ] || 1
1366
1440
  );
1367
1441
 
1368
1442
  }
@@ -1383,19 +1457,6 @@ class WebGPUBackend extends Backend {
1383
1457
 
1384
1458
  }
1385
1459
 
1386
- /**
1387
- * Can be used to synchronize CPU operations with GPU tasks. So when this method is called,
1388
- * the CPU waits for the GPU to complete its operation (e.g. a compute task).
1389
- *
1390
- * @async
1391
- * @return {Promise} A Promise that resolves when synchronization has been finished.
1392
- */
1393
- async waitForGPU() {
1394
-
1395
- await this.device.queue.onSubmittedWorkDone();
1396
-
1397
- }
1398
-
1399
1460
  // render object
1400
1461
 
1401
1462
  /**
@@ -1409,7 +1470,10 @@ class WebGPUBackend extends Backend {
1409
1470
  const { object, material, context, pipeline } = renderObject;
1410
1471
  const bindings = renderObject.getBindings();
1411
1472
  const renderContextData = this.get( context );
1412
- const pipelineGPU = this.get( pipeline ).pipeline;
1473
+ const pipelineData = this.get( pipeline );
1474
+ const pipelineGPU = pipelineData.pipeline;
1475
+
1476
+ if ( pipelineData.error === true ) return;
1413
1477
 
1414
1478
  const index = renderObject.getIndex();
1415
1479
  const hasIndex = ( index !== null );
@@ -1504,7 +1568,7 @@ class WebGPUBackend extends Backend {
1504
1568
  if ( drawInstances !== null ) {
1505
1569
 
1506
1570
  // @deprecated, r174
1507
- warnOnce( 'THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
1571
+ warnOnce( 'WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
1508
1572
 
1509
1573
  }
1510
1574
 
@@ -1768,6 +1832,11 @@ class WebGPUBackend extends Backend {
1768
1832
  const utils = this.utils;
1769
1833
  const renderContext = renderObject.context;
1770
1834
 
1835
+ // meshes with negative scale have a different frontFace render pipeline
1836
+ // descriptor value so the following must be honored in the cache key
1837
+
1838
+ const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
1839
+
1771
1840
  return [
1772
1841
  material.transparent, material.blending, material.premultipliedAlpha,
1773
1842
  material.blendSrc, material.blendDst, material.blendEquation,
@@ -1778,6 +1847,7 @@ class WebGPUBackend extends Backend {
1778
1847
  material.stencilFail, material.stencilZFail, material.stencilZPass,
1779
1848
  material.stencilFuncMask, material.stencilWriteMask,
1780
1849
  material.side,
1850
+ frontFaceCW,
1781
1851
  utils.getSampleCountRenderContext( renderContext ),
1782
1852
  utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ),
1783
1853
  utils.getPrimitiveTopology( object, material ),
@@ -1790,24 +1860,14 @@ class WebGPUBackend extends Backend {
1790
1860
  // textures
1791
1861
 
1792
1862
  /**
1793
- * Creates a GPU sampler for the given texture.
1863
+ * Updates a GPU sampler for the given texture.
1794
1864
  *
1795
- * @param {Texture} texture - The texture to create the sampler for.
1865
+ * @param {Texture} texture - The texture to update the sampler for.
1866
+ * @return {string} The current sampler key.
1796
1867
  */
1797
- createSampler( texture ) {
1868
+ updateSampler( texture ) {
1798
1869
 
1799
- this.textureUtils.createSampler( texture );
1800
-
1801
- }
1802
-
1803
- /**
1804
- * Destroys the GPU sampler for the given texture.
1805
- *
1806
- * @param {Texture} texture - The texture to destroy the sampler for.
1807
- */
1808
- destroySampler( texture ) {
1809
-
1810
- this.textureUtils.destroySampler( texture );
1870
+ return this.textureUtils.updateSampler( texture );
1811
1871
 
1812
1872
  }
1813
1873
 
@@ -1816,10 +1876,11 @@ class WebGPUBackend extends Backend {
1816
1876
  * as a placeholder until the actual texture is ready for usage.
1817
1877
  *
1818
1878
  * @param {Texture} texture - The texture to create a default texture for.
1879
+ * @return {boolean} Whether the sampler has been updated or not.
1819
1880
  */
1820
1881
  createDefaultTexture( texture ) {
1821
1882
 
1822
- this.textureUtils.createDefaultTexture( texture );
1883
+ return this.textureUtils.createDefaultTexture( texture );
1823
1884
 
1824
1885
  }
1825
1886
 
@@ -1862,10 +1923,11 @@ class WebGPUBackend extends Backend {
1862
1923
  * Destroys the GPU data for the given texture object.
1863
1924
  *
1864
1925
  * @param {Texture} texture - The texture.
1926
+ * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
1865
1927
  */
1866
- destroyTexture( texture ) {
1928
+ destroyTexture( texture, isDefaultTexture = false ) {
1867
1929
 
1868
- this.textureUtils.destroyTexture( texture );
1930
+ this.textureUtils.destroyTexture( texture, isDefaultTexture );
1869
1931
 
1870
1932
  }
1871
1933
 
@@ -1890,15 +1952,14 @@ class WebGPUBackend extends Backend {
1890
1952
  /**
1891
1953
  * Inits a time stamp query for the given render context.
1892
1954
  *
1893
- * @param {RenderContext} renderContext - The render context.
1955
+ * @param {string} type - The type of the timestamp query (e.g. 'render', 'compute').
1956
+ * @param {number} uid - Unique id for the context (e.g. render context id).
1894
1957
  * @param {Object} descriptor - The query descriptor.
1895
1958
  */
1896
- initTimestampQuery( renderContext, descriptor ) {
1959
+ initTimestampQuery( type, uid, descriptor ) {
1897
1960
 
1898
1961
  if ( ! this.trackTimestamp ) return;
1899
1962
 
1900
- const type = renderContext.isComputeNode ? 'compute' : 'render';
1901
-
1902
1963
  if ( ! this.timestampQueryPool[ type ] ) {
1903
1964
 
1904
1965
  // TODO: Variable maxQueries?
@@ -1908,13 +1969,13 @@ class WebGPUBackend extends Backend {
1908
1969
 
1909
1970
  const timestampQueryPool = this.timestampQueryPool[ type ];
1910
1971
 
1911
- const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext );
1972
+ const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
1912
1973
 
1913
1974
  descriptor.timestampWrites = {
1914
1975
  querySet: timestampQueryPool.querySet,
1915
1976
  beginningOfPassWriteIndex: baseOffset,
1916
1977
  endOfPassWriteIndex: baseOffset + 1,
1917
- };
1978
+ };
1918
1979
 
1919
1980
  }
1920
1981
 
@@ -2092,7 +2153,15 @@ class WebGPUBackend extends Backend {
2092
2153
  */
2093
2154
  createIndexAttribute( attribute ) {
2094
2155
 
2095
- this.attributeUtils.createAttribute( attribute, GPUBufferUsage.INDEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST );
2156
+ let usage = GPUBufferUsage.INDEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST;
2157
+
2158
+ if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) {
2159
+
2160
+ usage |= GPUBufferUsage.STORAGE;
2161
+
2162
+ }
2163
+
2164
+ this.attributeUtils.createAttribute( attribute, usage );
2096
2165
 
2097
2166
  }
2098
2167
 
@@ -2158,8 +2227,7 @@ class WebGPUBackend extends Backend {
2158
2227
  */
2159
2228
  updateSize() {
2160
2229
 
2161
- this.colorBuffer = this.textureUtils.getColorBuffer();
2162
- this.defaultRenderPassdescriptor = null;
2230
+ this.delete( this.renderer.getCanvasTarget() );
2163
2231
 
2164
2232
  }
2165
2233
 
@@ -2177,13 +2245,15 @@ class WebGPUBackend extends Backend {
2177
2245
  }
2178
2246
 
2179
2247
  /**
2180
- * Checks if the given feature is supported by the backend.
2248
+ * Checks if the given feature is supported by the backend.
2181
2249
  *
2182
2250
  * @param {string} name - The feature's name.
2183
2251
  * @return {boolean} Whether the feature is supported or not.
2184
2252
  */
2185
2253
  hasFeature( name ) {
2186
2254
 
2255
+ if ( GPUFeatureMap[ name ] !== undefined ) name = GPUFeatureMap[ name ];
2256
+
2187
2257
  return this.device.features.has( name );
2188
2258
 
2189
2259
  }
@@ -2322,7 +2392,7 @@ class WebGPUBackend extends Backend {
2322
2392
 
2323
2393
  if ( sourceGPU.format !== destinationGPU.format ) {
2324
2394
 
2325
- console.error( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format );
2395
+ error( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format );
2326
2396
 
2327
2397
  return;
2328
2398
 
@@ -2356,6 +2426,15 @@ class WebGPUBackend extends Backend {
2356
2426
  ]
2357
2427
  );
2358
2428
 
2429
+ // mipmaps must be genereated with the same encoder otherwise the copied texture data
2430
+ // might be out-of-sync, see #31768
2431
+
2432
+ if ( texture.generateMipmaps ) {
2433
+
2434
+ this.textureUtils.generateMipmaps( texture, encoder );
2435
+
2436
+ }
2437
+
2359
2438
  if ( renderContextData.currentPass ) {
2360
2439
 
2361
2440
  const { descriptor } = renderContextData;
@@ -2380,9 +2459,7 @@ class WebGPUBackend extends Backend {
2380
2459
 
2381
2460
  if ( renderContext.scissor ) {
2382
2461
 
2383
- const { x, y, width, height } = renderContext.scissorValue;
2384
-
2385
- renderContextData.currentPass.setScissorRect( x, y, width, height );
2462
+ this.updateScissor( renderContext );
2386
2463
 
2387
2464
  }
2388
2465
 
@@ -2392,11 +2469,11 @@ class WebGPUBackend extends Backend {
2392
2469
 
2393
2470
  }
2394
2471
 
2395
- if ( texture.generateMipmaps ) {
2472
+ }
2396
2473
 
2397
- this.textureUtils.generateMipmaps( texture );
2474
+ dispose() {
2398
2475
 
2399
- }
2476
+ this.textureUtils.dispose();
2400
2477
 
2401
2478
  }
2402
2479
 
@@ -2,6 +2,7 @@ import Renderer from '../common/Renderer.js';
2
2
  import WebGLBackend from '../webgl-fallback/WebGLBackend.js';
3
3
  import WebGPUBackend from './WebGPUBackend.js';
4
4
  import BasicNodeLibrary from './nodes/BasicNodeLibrary.js';
5
+ import { warn } from '../../utils.js';
5
6
 
6
7
  /**
7
8
  * This alternative version of {@link WebGPURenderer} only supports node materials.
@@ -31,7 +32,7 @@ class WebGPURenderer extends Renderer {
31
32
 
32
33
  parameters.getFallback = () => {
33
34
 
34
- console.warn( 'THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' );
35
+ warn( 'WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' );
35
36
 
36
37
  return new WebGLBackend( parameters );
37
38
 
@@ -2,13 +2,14 @@ import Renderer from '../common/Renderer.js';
2
2
  import WebGLBackend from '../webgl-fallback/WebGLBackend.js';
3
3
  import WebGPUBackend from './WebGPUBackend.js';
4
4
  import StandardNodeLibrary from './nodes/StandardNodeLibrary.js';
5
+ import { warn } from '../../utils.js';
5
6
  /*
6
7
  const debugHandler = {
7
8
 
8
9
  get: function ( target, name ) {
9
10
 
10
11
  // Add |update
11
- if ( /^(create|destroy)/.test( name ) ) console.log( 'WebGPUBackend.' + name );
12
+ if ( /^(create|destroy)/.test( name ) ) log( 'WebGPUBackend.' + name );
12
13
 
13
14
  return target[ name ];
14
15
 
@@ -62,7 +63,7 @@ class WebGPURenderer extends Renderer {
62
63
 
63
64
  parameters.getFallback = () => {
64
65
 
65
- console.warn( 'THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' );
66
+ warn( 'WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' );
66
67
 
67
68
  return new WebGLBackend( parameters );
68
69