@plastic-software/three 0.179.0 → 0.181.1

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 (430) hide show
  1. package/build/three.cjs +1108 -591
  2. package/build/three.core.js +616 -345
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +488 -250
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +37 -6
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +6576 -2152
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +6575 -2151
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  13. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  14. package/examples/jsm/Addons.js +1 -1
  15. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  16. package/examples/jsm/controls/ArcballControls.js +8 -8
  17. package/examples/jsm/controls/DragControls.js +7 -57
  18. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  19. package/examples/jsm/controls/FlyControls.js +1 -1
  20. package/examples/jsm/controls/OrbitControls.js +2 -2
  21. package/examples/jsm/controls/PointerLockControls.js +2 -10
  22. package/examples/jsm/controls/TrackballControls.js +1 -1
  23. package/examples/jsm/controls/TransformControls.js +1 -1
  24. package/examples/jsm/effects/AsciiEffect.js +8 -8
  25. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  26. package/examples/jsm/exporters/EXRExporter.js +1 -1
  27. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  28. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  29. package/examples/jsm/exporters/PLYExporter.js +1 -1
  30. package/examples/jsm/exporters/USDZExporter.js +9 -2
  31. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  34. package/examples/jsm/geometries/TextGeometry.js +3 -2
  35. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  36. package/examples/jsm/helpers/ViewHelper.js +43 -5
  37. package/examples/jsm/inspector/Inspector.js +427 -0
  38. package/examples/jsm/inspector/RendererInspector.js +415 -0
  39. package/examples/jsm/inspector/tabs/Console.js +204 -0
  40. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  41. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  42. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  43. package/examples/jsm/inspector/ui/Graph.js +95 -0
  44. package/examples/jsm/inspector/ui/Item.js +170 -0
  45. package/examples/jsm/inspector/ui/List.js +75 -0
  46. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  47. package/examples/jsm/inspector/ui/Style.js +654 -0
  48. package/examples/jsm/inspector/ui/Tab.js +46 -0
  49. package/examples/jsm/inspector/ui/Values.js +423 -0
  50. package/examples/jsm/inspector/ui/utils.js +56 -0
  51. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  52. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  53. package/examples/jsm/interactive/SelectionBox.js +30 -0
  54. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  55. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  56. package/examples/jsm/lines/Line2.js +3 -3
  57. package/examples/jsm/lines/LineGeometry.js +1 -1
  58. package/examples/jsm/lines/LineSegments2.js +2 -2
  59. package/examples/jsm/lines/Wireframe.js +2 -2
  60. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  61. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  62. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  63. package/examples/jsm/loaders/3MFLoader.js +1 -1
  64. package/examples/jsm/loaders/ColladaLoader.js +3 -3
  65. package/examples/jsm/loaders/DDSLoader.js +1 -1
  66. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  67. package/examples/jsm/loaders/EXRLoader.js +5 -5
  68. package/examples/jsm/loaders/FBXLoader.js +2 -2
  69. package/examples/jsm/loaders/FontLoader.js +23 -5
  70. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  71. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  72. package/examples/jsm/loaders/HDRLoader.js +486 -0
  73. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  74. package/examples/jsm/loaders/KTXLoader.js +2 -2
  75. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  76. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  77. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  78. package/examples/jsm/loaders/LWOLoader.js +2 -2
  79. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  80. package/examples/jsm/loaders/OBJLoader.js +1 -1
  81. package/examples/jsm/loaders/PDBLoader.js +1 -1
  82. package/examples/jsm/loaders/RGBELoader.js +7 -473
  83. package/examples/jsm/loaders/SVGLoader.js +2 -2
  84. package/examples/jsm/loaders/TTFLoader.js +4 -4
  85. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  86. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  87. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  88. package/examples/jsm/math/ColorSpaces.js +19 -1
  89. package/examples/jsm/math/ConvexHull.js +3 -3
  90. package/examples/jsm/math/ImprovedNoise.js +1 -1
  91. package/examples/jsm/math/Lut.js +2 -2
  92. package/examples/jsm/math/SimplexNoise.js +1 -1
  93. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  94. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  95. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  96. package/examples/jsm/misc/TubePainter.js +383 -40
  97. package/examples/jsm/misc/Volume.js +1 -1
  98. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  99. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  100. package/examples/jsm/objects/Sky.js +1 -1
  101. package/examples/jsm/objects/SkyMesh.js +1 -1
  102. package/examples/jsm/objects/Water.js +3 -3
  103. package/examples/jsm/objects/WaterMesh.js +6 -6
  104. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  105. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  106. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  107. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  108. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  109. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  110. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  111. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  112. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  113. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  114. package/examples/jsm/shaders/BokehShader.js +1 -1
  115. package/examples/jsm/shaders/BokehShader2.js +1 -1
  116. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  117. package/examples/jsm/shaders/FocusShader.js +1 -1
  118. package/examples/jsm/shaders/GTAOShader.js +2 -2
  119. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  120. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  122. package/examples/jsm/shaders/SSRShader.js +1 -1
  123. package/examples/jsm/shaders/SepiaShader.js +1 -1
  124. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  125. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  126. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
  127. package/examples/jsm/shaders/VignetteShader.js +1 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
  129. package/examples/jsm/transpiler/TSLEncoder.js +9 -10
  130. package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
  131. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  132. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  133. package/examples/jsm/tsl/display/BloomNode.js +7 -3
  134. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
  135. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  136. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  137. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  138. package/examples/jsm/tsl/display/GaussianBlurNode.js +49 -35
  139. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  140. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  141. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  142. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  143. package/examples/jsm/tsl/display/TRAANode.js +124 -7
  144. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  145. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  146. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  147. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  148. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  149. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  150. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  151. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  152. package/package.json +5 -10
  153. package/src/Three.Core.js +4 -2
  154. package/src/Three.TSL.js +36 -5
  155. package/src/Three.WebGPU.Nodes.js +2 -0
  156. package/src/Three.WebGPU.js +2 -0
  157. package/src/animation/AnimationClip.js +20 -4
  158. package/src/animation/AnimationMixer.js +3 -3
  159. package/src/animation/AnimationObjectGroup.js +2 -1
  160. package/src/animation/KeyframeTrack.js +7 -6
  161. package/src/animation/PropertyBinding.js +12 -11
  162. package/src/audio/Audio.js +10 -9
  163. package/src/audio/PositionalAudio.js +1 -1
  164. package/src/cameras/OrthographicCamera.js +1 -1
  165. package/src/cameras/PerspectiveCamera.js +1 -1
  166. package/src/cameras/StereoCamera.js +2 -2
  167. package/src/constants.js +11 -3
  168. package/src/core/BufferGeometry.js +10 -10
  169. package/src/core/EventDispatcher.js +1 -1
  170. package/src/core/InterleavedBuffer.js +1 -1
  171. package/src/core/InterleavedBufferAttribute.js +3 -2
  172. package/src/core/Object3D.js +3 -2
  173. package/src/core/Raycaster.js +2 -1
  174. package/src/core/RenderTarget.js +10 -1
  175. package/src/extras/Controls.js +5 -4
  176. package/src/extras/DataUtils.js +2 -1
  177. package/src/extras/Earcut.js +6 -0
  178. package/src/extras/ImageUtils.js +2 -2
  179. package/src/extras/PMREMGenerator.js +268 -55
  180. package/src/extras/TextureUtils.js +2 -1
  181. package/src/extras/core/Curve.js +2 -1
  182. package/src/extras/core/Interpolations.js +7 -1
  183. package/src/extras/core/ShapePath.js +4 -4
  184. package/src/extras/lib/earcut.js +8 -8
  185. package/src/geometries/BoxGeometry.js +1 -0
  186. package/src/geometries/CapsuleGeometry.js +1 -0
  187. package/src/geometries/CircleGeometry.js +1 -0
  188. package/src/geometries/ConeGeometry.js +1 -0
  189. package/src/geometries/CylinderGeometry.js +1 -0
  190. package/src/geometries/DodecahedronGeometry.js +1 -0
  191. package/src/geometries/ExtrudeGeometry.js +8 -6
  192. package/src/geometries/IcosahedronGeometry.js +1 -0
  193. package/src/geometries/LatheGeometry.js +1 -0
  194. package/src/geometries/OctahedronGeometry.js +1 -0
  195. package/src/geometries/PlaneGeometry.js +1 -0
  196. package/src/geometries/RingGeometry.js +1 -0
  197. package/src/geometries/ShapeGeometry.js +1 -0
  198. package/src/geometries/SphereGeometry.js +1 -0
  199. package/src/geometries/TetrahedronGeometry.js +1 -0
  200. package/src/geometries/TorusGeometry.js +1 -0
  201. package/src/geometries/TorusKnotGeometry.js +1 -0
  202. package/src/geometries/TubeGeometry.js +1 -0
  203. package/src/helpers/CameraHelper.js +1 -1
  204. package/src/lights/webgpu/ProjectorLight.js +1 -1
  205. package/src/loaders/AnimationLoader.js +2 -1
  206. package/src/loaders/AudioLoader.js +2 -1
  207. package/src/loaders/BufferGeometryLoader.js +2 -2
  208. package/src/loaders/Cache.js +2 -2
  209. package/src/loaders/DataTextureLoader.js +1 -1
  210. package/src/loaders/FileLoader.js +3 -2
  211. package/src/loaders/ImageBitmapLoader.js +5 -4
  212. package/src/loaders/ImageLoader.js +1 -1
  213. package/src/loaders/Loader.js +3 -3
  214. package/src/loaders/LoadingManager.js +25 -3
  215. package/src/loaders/MaterialLoader.js +3 -2
  216. package/src/loaders/ObjectLoader.js +13 -13
  217. package/src/loaders/TextureLoader.js +1 -1
  218. package/src/loaders/nodes/NodeLoader.js +3 -2
  219. package/src/materials/Material.js +16 -3
  220. package/src/materials/MeshBasicMaterial.js +1 -0
  221. package/src/materials/MeshDepthMaterial.js +1 -0
  222. package/src/materials/MeshDistanceMaterial.js +1 -1
  223. package/src/materials/MeshLambertMaterial.js +2 -1
  224. package/src/materials/MeshMatcapMaterial.js +22 -0
  225. package/src/materials/MeshNormalMaterial.js +1 -0
  226. package/src/materials/MeshPhongMaterial.js +2 -1
  227. package/src/materials/MeshPhysicalMaterial.js +2 -1
  228. package/src/materials/MeshStandardMaterial.js +8 -7
  229. package/src/materials/MeshToonMaterial.js +1 -0
  230. package/src/materials/PointsMaterial.js +1 -1
  231. package/src/materials/ShaderMaterial.js +2 -2
  232. package/src/materials/nodes/Line2NodeMaterial.js +2 -2
  233. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  234. package/src/materials/nodes/NodeMaterial.js +62 -22
  235. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  236. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  237. package/src/materials/nodes/manager/NodeMaterialObserver.js +3 -2
  238. package/src/math/Color.js +6 -5
  239. package/src/math/ColorManagement.js +9 -3
  240. package/src/math/Cylindrical.js +1 -1
  241. package/src/math/Euler.js +2 -1
  242. package/src/math/MathUtils.js +13 -11
  243. package/src/math/Matrix2.js +1 -1
  244. package/src/math/Matrix3.js +2 -2
  245. package/src/math/Matrix4.js +7 -7
  246. package/src/math/Plane.js +1 -1
  247. package/src/math/Quaternion.js +68 -66
  248. package/src/math/Spherical.js +1 -1
  249. package/src/nodes/Nodes.js +4 -1
  250. package/src/nodes/TSL.js +4 -1
  251. package/src/nodes/accessors/BufferNode.js +1 -1
  252. package/src/nodes/accessors/Camera.js +133 -7
  253. package/src/nodes/accessors/ClippingNode.js +6 -5
  254. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  255. package/src/nodes/accessors/InstanceNode.js +25 -5
  256. package/src/nodes/accessors/Lights.js +10 -0
  257. package/src/nodes/accessors/Normal.js +5 -4
  258. package/src/nodes/accessors/Object3DNode.js +1 -1
  259. package/src/nodes/accessors/Position.js +18 -2
  260. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  261. package/src/nodes/accessors/ReferenceNode.js +3 -2
  262. package/src/nodes/accessors/SceneNode.js +2 -1
  263. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  264. package/src/nodes/accessors/StorageTextureNode.js +22 -0
  265. package/src/nodes/accessors/Texture3DNode.js +14 -1
  266. package/src/nodes/accessors/TextureNode.js +130 -44
  267. package/src/nodes/code/FunctionCallNode.js +24 -4
  268. package/src/nodes/code/FunctionNode.js +23 -0
  269. package/src/nodes/core/ArrayNode.js +1 -0
  270. package/src/nodes/core/AssignNode.js +4 -3
  271. package/src/nodes/core/AttributeNode.js +2 -1
  272. package/src/nodes/core/ContextNode.js +29 -10
  273. package/src/nodes/core/IndexNode.js +2 -2
  274. package/src/nodes/core/InputNode.js +2 -1
  275. package/src/nodes/core/InspectorNode.js +128 -0
  276. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
  277. package/src/nodes/core/Node.js +152 -31
  278. package/src/nodes/core/NodeBuilder.js +183 -35
  279. package/src/nodes/core/NodeFrame.js +21 -21
  280. package/src/nodes/core/NodeFunction.js +2 -1
  281. package/src/nodes/core/NodeParser.js +2 -1
  282. package/src/nodes/core/NodeUniform.js +1 -1
  283. package/src/nodes/core/NodeUtils.js +17 -91
  284. package/src/nodes/core/ParameterNode.js +31 -0
  285. package/src/nodes/core/PropertyNode.js +7 -0
  286. package/src/nodes/core/StackNode.js +43 -16
  287. package/src/nodes/core/StructNode.js +5 -5
  288. package/src/nodes/core/StructTypeNode.js +1 -0
  289. package/src/nodes/core/SubBuildNode.js +2 -2
  290. package/src/nodes/core/UniformNode.js +18 -10
  291. package/src/nodes/core/VarNode.js +70 -33
  292. package/src/nodes/core/VaryingNode.js +3 -2
  293. package/src/nodes/display/BlendModes.js +5 -4
  294. package/src/nodes/display/BumpMapNode.js +1 -1
  295. package/src/nodes/display/ColorAdjustment.js +1 -1
  296. package/src/nodes/display/FrontFacingNode.js +4 -8
  297. package/src/nodes/display/NormalMapNode.js +2 -1
  298. package/src/nodes/display/PassNode.js +52 -11
  299. package/src/nodes/display/RenderOutputNode.js +28 -2
  300. package/src/nodes/display/ScreenNode.js +44 -14
  301. package/src/nodes/display/ToneMappingNode.js +31 -4
  302. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  303. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  304. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  305. package/src/nodes/display/ViewportTextureNode.js +42 -12
  306. package/src/nodes/fog/Fog.js +3 -2
  307. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  308. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  309. package/src/nodes/functions/BasicLightingModel.js +2 -1
  310. package/src/nodes/functions/PhysicalLightingModel.js +3 -2
  311. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  312. package/src/nodes/geometry/RangeNode.js +40 -4
  313. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  314. package/src/nodes/gpgpu/ComputeNode.js +17 -5
  315. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  316. package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
  317. package/src/nodes/lighting/EnvironmentNode.js +6 -6
  318. package/src/nodes/lighting/LightsNode.js +3 -4
  319. package/src/nodes/lighting/PointShadowNode.js +6 -0
  320. package/src/nodes/lighting/ShadowFilterNode.js +2 -0
  321. package/src/nodes/lighting/ShadowNode.js +75 -8
  322. package/src/nodes/math/BitcastNode.js +156 -0
  323. package/src/nodes/math/ConditionalNode.js +24 -7
  324. package/src/nodes/math/MathNode.js +25 -19
  325. package/src/nodes/math/OperatorNode.js +7 -5
  326. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  327. package/src/nodes/shapes/Shapes.js +1 -1
  328. package/src/nodes/tsl/TSLBase.js +5 -2
  329. package/src/nodes/tsl/TSLCore.js +460 -159
  330. package/src/nodes/utils/DebugNode.js +2 -1
  331. package/src/nodes/utils/EventNode.js +36 -0
  332. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  333. package/src/nodes/utils/JoinNode.js +6 -3
  334. package/src/nodes/utils/LoopNode.js +20 -24
  335. package/src/nodes/utils/MemberNode.js +59 -7
  336. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  337. package/src/nodes/utils/RTTNode.js +13 -3
  338. package/src/nodes/utils/ReflectorNode.js +58 -7
  339. package/src/nodes/utils/SampleNode.js +12 -2
  340. package/src/nodes/utils/SplitNode.js +11 -0
  341. package/src/nodes/utils/Timer.js +0 -47
  342. package/src/objects/BatchedMesh.js +2 -2
  343. package/src/objects/LOD.js +1 -1
  344. package/src/objects/Line.js +2 -1
  345. package/src/objects/LineSegments.js +2 -1
  346. package/src/objects/Skeleton.js +3 -2
  347. package/src/objects/SkinnedMesh.js +3 -1
  348. package/src/objects/Sprite.js +4 -3
  349. package/src/renderers/WebGLRenderer.js +48 -41
  350. package/src/renderers/common/Animation.js +13 -1
  351. package/src/renderers/common/Attributes.js +1 -1
  352. package/src/renderers/common/Backend.js +108 -27
  353. package/src/renderers/common/Background.js +2 -1
  354. package/src/renderers/common/Bindings.js +58 -2
  355. package/src/renderers/common/CanvasTarget.js +341 -0
  356. package/src/renderers/common/ChainMap.js +1 -1
  357. package/src/renderers/common/DataMap.js +1 -1
  358. package/src/renderers/common/Geometries.js +26 -0
  359. package/src/renderers/common/Info.js +4 -2
  360. package/src/renderers/common/InspectorBase.js +146 -0
  361. package/src/renderers/common/Pipelines.js +1 -1
  362. package/src/renderers/common/PostProcessing.js +6 -25
  363. package/src/renderers/common/QuadMesh.js +7 -1
  364. package/src/renderers/common/RenderContext.js +2 -2
  365. package/src/renderers/common/RenderList.js +7 -3
  366. package/src/renderers/common/RenderObject.js +16 -2
  367. package/src/renderers/common/RenderObjects.js +1 -1
  368. package/src/renderers/common/Renderer.js +473 -245
  369. package/src/renderers/common/RendererUtils.js +9 -0
  370. package/src/renderers/common/SampledTexture.js +9 -1
  371. package/src/renderers/common/Sampler.js +50 -12
  372. package/src/renderers/common/StorageTexture.js +9 -1
  373. package/src/renderers/common/Textures.js +121 -45
  374. package/src/renderers/common/TimestampQueryPool.js +65 -3
  375. package/src/renderers/common/UniformsGroup.js +2 -1
  376. package/src/renderers/common/XRManager.js +42 -22
  377. package/src/renderers/common/extras/PMREMGenerator.js +160 -65
  378. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  379. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  380. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  381. package/src/renderers/common/nodes/Nodes.js +38 -16
  382. package/src/renderers/shaders/DFGLUTData.js +64 -0
  383. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  384. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  386. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  387. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  388. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  389. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  390. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  391. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
  392. package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
  393. package/src/renderers/shaders/UniformsLib.js +1 -0
  394. package/src/renderers/shaders/UniformsUtils.js +25 -4
  395. package/src/renderers/webgl/WebGLCapabilities.js +2 -1
  396. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  397. package/src/renderers/webgl/WebGLInfo.js +3 -1
  398. package/src/renderers/webgl/WebGLProgram.js +15 -14
  399. package/src/renderers/webgl/WebGLPrograms.js +2 -1
  400. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  401. package/src/renderers/webgl/WebGLState.js +15 -14
  402. package/src/renderers/webgl/WebGLTextures.js +19 -14
  403. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  404. package/src/renderers/webgl/WebGLUtils.js +3 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +199 -167
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +181 -25
  407. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  408. package/src/renderers/webgl-fallback/utils/WebGLState.js +7 -6
  409. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +169 -19
  410. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  411. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  412. package/src/renderers/webgpu/WebGPUBackend.js +153 -123
  413. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  414. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  415. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +142 -50
  416. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  417. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
  418. package/src/renderers/webgpu/utils/WebGPUConstants.js +7 -2
  419. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +53 -34
  420. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  421. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +260 -99
  422. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  423. package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
  424. package/src/renderers/webxr/WebXRManager.js +42 -26
  425. package/src/textures/ExternalTexture.js +15 -4
  426. package/src/textures/Source.js +3 -2
  427. package/src/textures/Texture.js +3 -2
  428. package/src/textures/VideoTexture.js +2 -3
  429. package/src/utils.js +67 -3
  430. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
@@ -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.
@@ -1298,11 +1322,13 @@ class WebGPUBackend extends Backend {
1298
1322
 
1299
1323
  const groupGPU = this.get( computeGroup );
1300
1324
 
1325
+ //
1326
+
1301
1327
  const descriptor = {
1302
1328
  label: 'computeGroup_' + computeGroup.id
1303
1329
  };
1304
1330
 
1305
- this.initTimestampQuery( computeGroup, descriptor );
1331
+ this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ), descriptor );
1306
1332
 
1307
1333
  groupGPU.cmdEncoderGPU = this.device.createCommandEncoder( { label: 'computeGroup_' + computeGroup.id } );
1308
1334
 
@@ -1317,9 +1343,12 @@ class WebGPUBackend extends Backend {
1317
1343
  * @param {Node} computeNode - The compute node.
1318
1344
  * @param {Array<BindGroup>} bindings - The bindings.
1319
1345
  * @param {ComputePipeline} pipeline - The compute pipeline.
1320
- * @param {Array<number>|number} [dispatchSizeOrCount=null] - Array with [ x, y, z ] values for dispatch or a single number for the count.
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, dispatchSizeOrCount = null ) {
1351
+ compute( computeGroup, computeNode, bindings, pipeline, dispatchSize = null ) {
1323
1352
 
1324
1353
  const computeNodeData = this.get( computeNode );
1325
1354
  const { passEncoderGPU } = this.get( computeGroup );
@@ -1341,19 +1370,29 @@ class WebGPUBackend extends Backend {
1341
1370
 
1342
1371
  }
1343
1372
 
1344
- let dispatchSize;
1373
+ if ( dispatchSize === null ) {
1374
+
1375
+ dispatchSize = computeNode.count;
1376
+
1377
+ }
1378
+
1379
+ // When the dispatchSize is set with a StorageBuffer from the GPU.
1380
+
1381
+ if ( dispatchSize && typeof dispatchSize === 'object' && dispatchSize.isIndirectStorageBufferAttribute ) {
1345
1382
 
1346
- if ( dispatchSizeOrCount === null ) {
1383
+ const dispatchBuffer = this.get( dispatchSize ).buffer;
1347
1384
 
1348
- dispatchSizeOrCount = computeNode.count;
1385
+ passEncoderGPU.dispatchWorkgroupsIndirect( dispatchBuffer, 0 );
1386
+
1387
+ return;
1349
1388
 
1350
1389
  }
1351
1390
 
1352
- if ( typeof dispatchSizeOrCount === 'number' ) {
1391
+ if ( typeof dispatchSize === 'number' ) {
1353
1392
 
1354
1393
  // If a single number is given, we calculate the dispatch size based on the workgroup size
1355
1394
 
1356
- const count = dispatchSizeOrCount;
1395
+ const count = dispatchSize;
1357
1396
 
1358
1397
  if ( computeNodeData.dispatchSize === undefined || computeNodeData.count !== count ) {
1359
1398
 
@@ -1390,10 +1429,6 @@ class WebGPUBackend extends Backend {
1390
1429
 
1391
1430
  dispatchSize = computeNodeData.dispatchSize;
1392
1431
 
1393
- } else {
1394
-
1395
- dispatchSize = dispatchSizeOrCount;
1396
-
1397
1432
  }
1398
1433
 
1399
1434
  //
@@ -1422,19 +1457,6 @@ class WebGPUBackend extends Backend {
1422
1457
 
1423
1458
  }
1424
1459
 
1425
- /**
1426
- * Can be used to synchronize CPU operations with GPU tasks. So when this method is called,
1427
- * the CPU waits for the GPU to complete its operation (e.g. a compute task).
1428
- *
1429
- * @async
1430
- * @return {Promise} A Promise that resolves when synchronization has been finished.
1431
- */
1432
- async waitForGPU() {
1433
-
1434
- await this.device.queue.onSubmittedWorkDone();
1435
-
1436
- }
1437
-
1438
1460
  // render object
1439
1461
 
1440
1462
  /**
@@ -1448,7 +1470,10 @@ class WebGPUBackend extends Backend {
1448
1470
  const { object, material, context, pipeline } = renderObject;
1449
1471
  const bindings = renderObject.getBindings();
1450
1472
  const renderContextData = this.get( context );
1451
- const pipelineGPU = this.get( pipeline ).pipeline;
1473
+ const pipelineData = this.get( pipeline );
1474
+ const pipelineGPU = pipelineData.pipeline;
1475
+
1476
+ if ( pipelineData.error === true ) return;
1452
1477
 
1453
1478
  const index = renderObject.getIndex();
1454
1479
  const hasIndex = ( index !== null );
@@ -1543,7 +1568,7 @@ class WebGPUBackend extends Backend {
1543
1568
  if ( drawInstances !== null ) {
1544
1569
 
1545
1570
  // @deprecated, r174
1546
- 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.' );
1547
1572
 
1548
1573
  }
1549
1574
 
@@ -1807,6 +1832,11 @@ class WebGPUBackend extends Backend {
1807
1832
  const utils = this.utils;
1808
1833
  const renderContext = renderObject.context;
1809
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
+
1810
1840
  return [
1811
1841
  material.transparent, material.blending, material.premultipliedAlpha,
1812
1842
  material.blendSrc, material.blendDst, material.blendEquation,
@@ -1817,6 +1847,7 @@ class WebGPUBackend extends Backend {
1817
1847
  material.stencilFail, material.stencilZFail, material.stencilZPass,
1818
1848
  material.stencilFuncMask, material.stencilWriteMask,
1819
1849
  material.side,
1850
+ frontFaceCW,
1820
1851
  utils.getSampleCountRenderContext( renderContext ),
1821
1852
  utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ),
1822
1853
  utils.getPrimitiveTopology( object, material ),
@@ -1829,24 +1860,14 @@ class WebGPUBackend extends Backend {
1829
1860
  // textures
1830
1861
 
1831
1862
  /**
1832
- * Creates a GPU sampler for the given texture.
1833
- *
1834
- * @param {Texture} texture - The texture to create the sampler for.
1835
- */
1836
- createSampler( texture ) {
1837
-
1838
- this.textureUtils.createSampler( texture );
1839
-
1840
- }
1841
-
1842
- /**
1843
- * Destroys the GPU sampler for the given texture.
1863
+ * Updates a GPU sampler for the given texture.
1844
1864
  *
1845
- * @param {Texture} texture - The texture to destroy the sampler for.
1865
+ * @param {Texture} texture - The texture to update the sampler for.
1866
+ * @return {string} The current sampler key.
1846
1867
  */
1847
- destroySampler( texture ) {
1868
+ updateSampler( texture ) {
1848
1869
 
1849
- this.textureUtils.destroySampler( texture );
1870
+ return this.textureUtils.updateSampler( texture );
1850
1871
 
1851
1872
  }
1852
1873
 
@@ -1855,10 +1876,11 @@ class WebGPUBackend extends Backend {
1855
1876
  * as a placeholder until the actual texture is ready for usage.
1856
1877
  *
1857
1878
  * @param {Texture} texture - The texture to create a default texture for.
1879
+ * @return {boolean} Whether the sampler has been updated or not.
1858
1880
  */
1859
1881
  createDefaultTexture( texture ) {
1860
1882
 
1861
- this.textureUtils.createDefaultTexture( texture );
1883
+ return this.textureUtils.createDefaultTexture( texture );
1862
1884
 
1863
1885
  }
1864
1886
 
@@ -1901,10 +1923,11 @@ class WebGPUBackend extends Backend {
1901
1923
  * Destroys the GPU data for the given texture object.
1902
1924
  *
1903
1925
  * @param {Texture} texture - The texture.
1926
+ * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
1904
1927
  */
1905
- destroyTexture( texture ) {
1928
+ destroyTexture( texture, isDefaultTexture = false ) {
1906
1929
 
1907
- this.textureUtils.destroyTexture( texture );
1930
+ this.textureUtils.destroyTexture( texture, isDefaultTexture );
1908
1931
 
1909
1932
  }
1910
1933
 
@@ -1929,15 +1952,14 @@ class WebGPUBackend extends Backend {
1929
1952
  /**
1930
1953
  * Inits a time stamp query for the given render context.
1931
1954
  *
1932
- * @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).
1933
1957
  * @param {Object} descriptor - The query descriptor.
1934
1958
  */
1935
- initTimestampQuery( renderContext, descriptor ) {
1959
+ initTimestampQuery( type, uid, descriptor ) {
1936
1960
 
1937
1961
  if ( ! this.trackTimestamp ) return;
1938
1962
 
1939
- const type = renderContext.isComputeNode ? 'compute' : 'render';
1940
-
1941
1963
  if ( ! this.timestampQueryPool[ type ] ) {
1942
1964
 
1943
1965
  // TODO: Variable maxQueries?
@@ -1947,13 +1969,13 @@ class WebGPUBackend extends Backend {
1947
1969
 
1948
1970
  const timestampQueryPool = this.timestampQueryPool[ type ];
1949
1971
 
1950
- const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext );
1972
+ const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
1951
1973
 
1952
1974
  descriptor.timestampWrites = {
1953
1975
  querySet: timestampQueryPool.querySet,
1954
1976
  beginningOfPassWriteIndex: baseOffset,
1955
1977
  endOfPassWriteIndex: baseOffset + 1,
1956
- };
1978
+ };
1957
1979
 
1958
1980
  }
1959
1981
 
@@ -2205,8 +2227,7 @@ class WebGPUBackend extends Backend {
2205
2227
  */
2206
2228
  updateSize() {
2207
2229
 
2208
- this.colorBuffer = this.textureUtils.getColorBuffer();
2209
- this.defaultRenderPassdescriptor = null;
2230
+ this.delete( this.renderer.getCanvasTarget() );
2210
2231
 
2211
2232
  }
2212
2233
 
@@ -2224,13 +2245,15 @@ class WebGPUBackend extends Backend {
2224
2245
  }
2225
2246
 
2226
2247
  /**
2227
- * Checks if the given feature is supported by the backend.
2248
+ * Checks if the given feature is supported by the backend.
2228
2249
  *
2229
2250
  * @param {string} name - The feature's name.
2230
2251
  * @return {boolean} Whether the feature is supported or not.
2231
2252
  */
2232
2253
  hasFeature( name ) {
2233
2254
 
2255
+ if ( GPUFeatureMap[ name ] !== undefined ) name = GPUFeatureMap[ name ];
2256
+
2234
2257
  return this.device.features.has( name );
2235
2258
 
2236
2259
  }
@@ -2369,7 +2392,7 @@ class WebGPUBackend extends Backend {
2369
2392
 
2370
2393
  if ( sourceGPU.format !== destinationGPU.format ) {
2371
2394
 
2372
- 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 );
2373
2396
 
2374
2397
  return;
2375
2398
 
@@ -2403,6 +2426,15 @@ class WebGPUBackend extends Backend {
2403
2426
  ]
2404
2427
  );
2405
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
+
2406
2438
  if ( renderContextData.currentPass ) {
2407
2439
 
2408
2440
  const { descriptor } = renderContextData;
@@ -2427,9 +2459,7 @@ class WebGPUBackend extends Backend {
2427
2459
 
2428
2460
  if ( renderContext.scissor ) {
2429
2461
 
2430
- const { x, y, width, height } = renderContext.scissorValue;
2431
-
2432
- renderContextData.currentPass.setScissorRect( x, y, width, height );
2462
+ this.updateScissor( renderContext );
2433
2463
 
2434
2464
  }
2435
2465
 
@@ -2439,11 +2469,11 @@ class WebGPUBackend extends Backend {
2439
2469
 
2440
2470
  }
2441
2471
 
2442
- if ( texture.generateMipmaps ) {
2472
+ }
2443
2473
 
2444
- this.textureUtils.generateMipmaps( texture );
2474
+ dispose() {
2445
2475
 
2446
- }
2476
+ this.textureUtils.dispose();
2447
2477
 
2448
2478
  }
2449
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