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
@@ -13,11 +13,12 @@ import {
13
13
  RGBAFormat, RGBFormat, RedFormat, RGFormat, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, UnsignedByteType, FloatType, HalfFloatType, SRGBTransfer, DepthFormat, DepthStencilFormat,
14
14
  RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format,
15
15
  RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, UnsignedIntType, UnsignedShortType, UnsignedInt248Type, UnsignedInt5999Type,
16
- NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, IntType, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat
16
+ NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, IntType, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat,
17
+ UnsignedInt101111Type, RGBA_BPTC_Format, RGB_ETC1_Format, RGB_S3TC_DXT1_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format
17
18
  } from '../../../constants.js';
18
19
  import { CubeTexture } from '../../../textures/CubeTexture.js';
19
- import { DepthTexture } from '../../../textures/DepthTexture.js';
20
20
  import { Texture } from '../../../textures/Texture.js';
21
+ import { warn, error } from '../../../utils.js';
21
22
 
22
23
  const _compareToWebGPU = {
23
24
  [ NeverCompare ]: 'never',
@@ -86,20 +87,11 @@ class WebGPUTextureUtils {
86
87
  this.defaultVideoFrame = null;
87
88
 
88
89
  /**
89
- * Represents the color attachment of the default framebuffer.
90
+ * A cache of shared texture samplers.
90
91
  *
91
- * @type {?GPUTexture}
92
- * @default null
93
- */
94
- this.colorBuffer = null;
95
-
96
- /**
97
- * Represents the depth attachment of the default framebuffer.
98
- *
99
- * @type {DepthTexture}
92
+ * @type {Map<string, Object>}
100
93
  */
101
- this.depthTexture = new DepthTexture();
102
- this.depthTexture.name = 'depthBuffer';
94
+ this._samplerCache = new Map();
103
95
 
104
96
  }
105
97
 
@@ -107,39 +99,81 @@ class WebGPUTextureUtils {
107
99
  * Creates a GPU sampler for the given texture.
108
100
  *
109
101
  * @param {Texture} texture - The texture to create the sampler for.
102
+ * @return {string} The current sampler key.
110
103
  */
111
- createSampler( texture ) {
104
+ updateSampler( texture ) {
112
105
 
113
106
  const backend = this.backend;
114
- const device = backend.device;
115
-
116
- const textureGPU = backend.get( texture );
117
-
118
- const samplerDescriptorGPU = {
119
- addressModeU: this._convertAddressMode( texture.wrapS ),
120
- addressModeV: this._convertAddressMode( texture.wrapT ),
121
- addressModeW: this._convertAddressMode( texture.wrapR ),
122
- magFilter: this._convertFilterMode( texture.magFilter ),
123
- minFilter: this._convertFilterMode( texture.minFilter ),
124
- mipmapFilter: this._convertFilterMode( texture.minFilter ),
125
- maxAnisotropy: 1
126
- };
127
107
 
128
- // anisotropy can only be used when all filter modes are set to linear.
108
+ const samplerKey = texture.minFilter + '-' + texture.magFilter + '-' +
109
+ texture.wrapS + '-' + texture.wrapT + '-' + ( texture.wrapR || '0' ) + '-' +
110
+ texture.anisotropy + '-' + ( texture.compareFunction || 0 );
111
+
112
+ let samplerData = this._samplerCache.get( samplerKey );
113
+
114
+ if ( samplerData === undefined ) {
115
+
116
+ const samplerDescriptorGPU = {
117
+ addressModeU: this._convertAddressMode( texture.wrapS ),
118
+ addressModeV: this._convertAddressMode( texture.wrapT ),
119
+ addressModeW: this._convertAddressMode( texture.wrapR ),
120
+ magFilter: this._convertFilterMode( texture.magFilter ),
121
+ minFilter: this._convertFilterMode( texture.minFilter ),
122
+ mipmapFilter: this._convertFilterMode( texture.minFilter ),
123
+ maxAnisotropy: 1
124
+ };
125
+
126
+ // anisotropy can only be used when all filter modes are set to linear.
127
+
128
+ if ( samplerDescriptorGPU.magFilter === GPUFilterMode.Linear && samplerDescriptorGPU.minFilter === GPUFilterMode.Linear && samplerDescriptorGPU.mipmapFilter === GPUFilterMode.Linear ) {
129
+
130
+ samplerDescriptorGPU.maxAnisotropy = texture.anisotropy;
131
+
132
+ }
133
+
134
+ if ( texture.isDepthTexture && texture.compareFunction !== null ) {
135
+
136
+ samplerDescriptorGPU.compare = _compareToWebGPU[ texture.compareFunction ];
137
+
138
+ }
139
+
140
+ const sampler = backend.device.createSampler( samplerDescriptorGPU );
129
141
 
130
- if ( samplerDescriptorGPU.magFilter === GPUFilterMode.Linear && samplerDescriptorGPU.minFilter === GPUFilterMode.Linear && samplerDescriptorGPU.mipmapFilter === GPUFilterMode.Linear ) {
142
+ samplerData = { sampler, usedTimes: 0 };
131
143
 
132
- samplerDescriptorGPU.maxAnisotropy = texture.anisotropy;
144
+ this._samplerCache.set( samplerKey, samplerData );
133
145
 
134
146
  }
135
147
 
136
- if ( texture.isDepthTexture && texture.compareFunction !== null ) {
148
+ const textureData = backend.get( texture );
149
+
150
+ if ( textureData.sampler !== samplerData.sampler ) {
151
+
152
+ // check if previous sampler is unused so it can be deleted
153
+
154
+ if ( textureData.sampler !== undefined ) {
155
+
156
+ const oldSamplerData = this._samplerCache.get( textureData.samplerKey );
157
+ oldSamplerData.usedTimes --;
158
+
159
+ if ( oldSamplerData.usedTimes === 0 ) {
160
+
161
+ this._samplerCache.delete( textureData.samplerKey );
162
+
163
+ }
164
+
165
+ }
166
+
167
+ // update to new sampler data
168
+
169
+ textureData.samplerKey = samplerKey;
170
+ textureData.sampler = samplerData.sampler;
137
171
 
138
- samplerDescriptorGPU.compare = _compareToWebGPU[ texture.compareFunction ];
172
+ samplerData.usedTimes ++;
139
173
 
140
174
  }
141
175
 
142
- textureGPU.sampler = device.createSampler( samplerDescriptorGPU );
176
+ return samplerKey;
143
177
 
144
178
  }
145
179
 
@@ -159,10 +193,6 @@ class WebGPUTextureUtils {
159
193
 
160
194
  textureGPU = this._getDefaultCubeTextureGPU( format );
161
195
 
162
- } else if ( texture.isVideoTexture ) {
163
-
164
- this.backend.get( texture ).externalTexture = this._getDefaultVideoFrame();
165
-
166
196
  } else {
167
197
 
168
198
  textureGPU = this._getDefaultTextureGPU( format );
@@ -190,6 +220,15 @@ class WebGPUTextureUtils {
190
220
 
191
221
  }
192
222
 
223
+ if ( texture.isExternalTexture ) {
224
+
225
+ textureData.texture = texture.sourceTexture;
226
+ textureData.initialized = true;
227
+
228
+ return;
229
+
230
+ }
231
+
193
232
  if ( options.needsMipmaps === undefined ) options.needsMipmaps = false;
194
233
  if ( options.levels === undefined ) options.levels = 1;
195
234
  if ( options.depth === undefined ) options.depth = 1;
@@ -225,7 +264,7 @@ class WebGPUTextureUtils {
225
264
 
226
265
  }
227
266
 
228
- if ( texture.isCompressedTexture !== true && texture.isCompressedArrayTexture !== true ) {
267
+ if ( texture.isCompressedTexture !== true && texture.isCompressedArrayTexture !== true && format !== GPUTextureFormat.RGB9E5UFloat ) {
229
268
 
230
269
  usage |= GPUTextureUsage.RENDER_ATTACHMENT;
231
270
 
@@ -247,45 +286,30 @@ class WebGPUTextureUtils {
247
286
 
248
287
  // texture creation
249
288
 
250
- if ( texture.isVideoTexture ) {
251
-
252
- const video = texture.source.data;
253
- const videoFrame = new VideoFrame( video );
254
-
255
- textureDescriptorGPU.size.width = videoFrame.displayWidth;
256
- textureDescriptorGPU.size.height = videoFrame.displayHeight;
257
-
258
- videoFrame.close();
259
-
260
- textureData.externalTexture = video;
261
-
262
- } else {
263
-
264
- if ( format === undefined ) {
265
-
266
- console.warn( 'WebGPURenderer: Texture format not supported.' );
267
-
268
- this.createDefaultTexture( texture );
269
- return;
289
+ if ( format === undefined ) {
270
290
 
271
- }
291
+ warn( 'WebGPURenderer: Texture format not supported.' );
272
292
 
273
- if ( texture.isCubeTexture ) {
293
+ this.createDefaultTexture( texture );
294
+ return;
274
295
 
275
- textureDescriptorGPU.textureBindingViewDimension = GPUTextureViewDimension.Cube;
296
+ }
276
297
 
277
- }
298
+ if ( texture.isCubeTexture ) {
278
299
 
279
- textureData.texture = backend.device.createTexture( textureDescriptorGPU );
300
+ textureDescriptorGPU.textureBindingViewDimension = GPUTextureViewDimension.Cube;
280
301
 
281
302
  }
282
303
 
304
+ textureData.texture = backend.device.createTexture( textureDescriptorGPU );
305
+
283
306
  if ( isMSAA ) {
284
307
 
285
308
  const msaaTextureDescriptorGPU = Object.assign( {}, textureDescriptorGPU );
286
309
 
287
310
  msaaTextureDescriptorGPU.label = msaaTextureDescriptorGPU.label + '-msaa';
288
311
  msaaTextureDescriptorGPU.sampleCount = samples;
312
+ msaaTextureDescriptorGPU.mipLevelCount = 1; // See https://www.w3.org/TR/webgpu/#texture-creation
289
313
 
290
314
  textureData.msaaTexture = backend.device.createTexture( msaaTextureDescriptorGPU );
291
315
 
@@ -301,13 +325,14 @@ class WebGPUTextureUtils {
301
325
  * Destroys the GPU data for the given texture object.
302
326
  *
303
327
  * @param {Texture} texture - The texture.
328
+ * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
304
329
  */
305
- destroyTexture( texture ) {
330
+ destroyTexture( texture, isDefaultTexture = false ) {
306
331
 
307
332
  const backend = this.backend;
308
333
  const textureData = backend.get( texture );
309
334
 
310
- if ( textureData.texture !== undefined ) textureData.texture.destroy();
335
+ if ( textureData.texture !== undefined && isDefaultTexture === false ) textureData.texture.destroy();
311
336
 
312
337
  if ( textureData.msaaTexture !== undefined ) textureData.msaaTexture.destroy();
313
338
 
@@ -315,26 +340,13 @@ class WebGPUTextureUtils {
315
340
 
316
341
  }
317
342
 
318
- /**
319
- * Destroys the GPU sampler for the given texture.
320
- *
321
- * @param {Texture} texture - The texture to destroy the sampler for.
322
- */
323
- destroySampler( texture ) {
324
-
325
- const backend = this.backend;
326
- const textureData = backend.get( texture );
327
-
328
- delete textureData.sampler;
329
-
330
- }
331
-
332
343
  /**
333
344
  * Generates mipmaps for the given texture.
334
345
  *
335
346
  * @param {Texture} texture - The texture.
347
+ * @param {?GPUCommandEncoder} [encoder=null] - An optional command encoder used to generate mipmaps.
336
348
  */
337
- generateMipmaps( texture ) {
349
+ generateMipmaps( texture, encoder = null ) {
338
350
 
339
351
  const textureData = this.backend.get( texture );
340
352
 
@@ -342,7 +354,7 @@ class WebGPUTextureUtils {
342
354
 
343
355
  for ( let i = 0; i < 6; i ++ ) {
344
356
 
345
- this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i );
357
+ this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i, encoder );
346
358
 
347
359
  }
348
360
 
@@ -352,7 +364,7 @@ class WebGPUTextureUtils {
352
364
 
353
365
  for ( let i = 0; i < depth; i ++ ) {
354
366
 
355
- this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i );
367
+ this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i, encoder );
356
368
 
357
369
  }
358
370
 
@@ -368,24 +380,47 @@ class WebGPUTextureUtils {
368
380
  */
369
381
  getColorBuffer() {
370
382
 
371
- if ( this.colorBuffer ) this.colorBuffer.destroy();
372
-
373
383
  const backend = this.backend;
384
+ const canvasTarget = backend.renderer.getCanvasTarget();
374
385
  const { width, height } = backend.getDrawingBufferSize();
386
+ const samples = backend.renderer.currentSamples;
387
+
388
+ const colorTexture = canvasTarget.colorTexture;
389
+ const colorTextureData = backend.get( colorTexture );
390
+
391
+ if ( colorTexture.width === width && colorTexture.height === height && colorTexture.samples === samples ) {
392
+
393
+ return colorTextureData.texture;
375
394
 
376
- this.colorBuffer = backend.device.createTexture( {
395
+ }
396
+
397
+ // recreate
398
+
399
+ let colorBuffer = colorTextureData.texture;
400
+
401
+ if ( colorBuffer ) colorBuffer.destroy();
402
+
403
+ colorBuffer = backend.device.createTexture( {
377
404
  label: 'colorBuffer',
378
405
  size: {
379
406
  width: width,
380
407
  height: height,
381
408
  depthOrArrayLayers: 1
382
409
  },
383
- sampleCount: backend.utils.getSampleCount( backend.renderer.samples ),
410
+ sampleCount: backend.utils.getSampleCount( backend.renderer.currentSamples ),
384
411
  format: backend.utils.getPreferredCanvasFormat(),
385
412
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
386
413
  } );
387
414
 
388
- return this.colorBuffer;
415
+ //
416
+
417
+ colorTexture.source.width = width;
418
+ colorTexture.source.height = height;
419
+ colorTexture.samples = samples;
420
+
421
+ colorTextureData.texture = colorBuffer;
422
+
423
+ return colorBuffer;
389
424
 
390
425
  }
391
426
 
@@ -400,9 +435,24 @@ class WebGPUTextureUtils {
400
435
  getDepthBuffer( depth = true, stencil = false ) {
401
436
 
402
437
  const backend = this.backend;
438
+ const canvasTarget = backend.renderer.getCanvasTarget();
403
439
  const { width, height } = backend.getDrawingBufferSize();
440
+ const samples = backend.renderer.currentSamples;
441
+
442
+ const depthTexture = canvasTarget.depthTexture;
443
+
444
+ if ( depthTexture.width === width &&
445
+ depthTexture.height === height &&
446
+ depthTexture.samples === samples &&
447
+ depthTexture.depth === depth &&
448
+ depthTexture.stencil === stencil ) {
449
+
450
+ return backend.get( depthTexture ).texture;
451
+
452
+ }
453
+
454
+ //
404
455
 
405
- const depthTexture = this.depthTexture;
406
456
  const depthTextureGPU = backend.get( depthTexture ).texture;
407
457
 
408
458
  let format, type;
@@ -421,7 +471,7 @@ class WebGPUTextureUtils {
421
471
 
422
472
  if ( depthTextureGPU !== undefined ) {
423
473
 
424
- if ( depthTexture.image.width === width && depthTexture.image.height === height && depthTexture.format === format && depthTexture.type === type ) {
474
+ if ( depthTexture.image.width === width && depthTexture.image.height === height && depthTexture.format === format && depthTexture.type === type && depthTexture.samples === samples ) {
425
475
 
426
476
  return depthTextureGPU;
427
477
 
@@ -431,11 +481,14 @@ class WebGPUTextureUtils {
431
481
 
432
482
  }
433
483
 
484
+ // recreate
485
+
434
486
  depthTexture.name = 'depthBuffer';
435
487
  depthTexture.format = format;
436
488
  depthTexture.type = type;
437
489
  depthTexture.image.width = width;
438
490
  depthTexture.image.height = height;
491
+ depthTexture.samples = samples;
439
492
 
440
493
  this.createTexture( depthTexture, { width, height } );
441
494
 
@@ -452,6 +505,7 @@ class WebGPUTextureUtils {
452
505
  updateTexture( texture, options ) {
453
506
 
454
507
  const textureData = this.backend.get( texture );
508
+ const mipmaps = texture.mipmaps;
455
509
 
456
510
  const { textureDescriptorGPU } = textureData;
457
511
 
@@ -462,7 +516,22 @@ class WebGPUTextureUtils {
462
516
 
463
517
  if ( texture.isDataTexture ) {
464
518
 
465
- this._copyBufferToTexture( options.image, textureData.texture, textureDescriptorGPU, 0, texture.flipY );
519
+ if ( mipmaps.length > 0 ) {
520
+
521
+ for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
522
+
523
+ const mipmap = mipmaps[ i ];
524
+
525
+ this._copyBufferToTexture( mipmap, textureData.texture, textureDescriptorGPU, 0, texture.flipY, 0, i );
526
+
527
+ }
528
+
529
+
530
+ } else {
531
+
532
+ this._copyBufferToTexture( options.image, textureData.texture, textureDescriptorGPU, 0, texture.flipY );
533
+
534
+ }
466
535
 
467
536
  } else if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {
468
537
 
@@ -478,17 +547,26 @@ class WebGPUTextureUtils {
478
547
 
479
548
  } else if ( texture.isCubeTexture ) {
480
549
 
481
- this._copyCubeMapToTexture( options.images, textureData.texture, textureDescriptorGPU, texture.flipY, texture.premultiplyAlpha );
550
+ this._copyCubeMapToTexture( texture, textureData.texture, textureDescriptorGPU );
482
551
 
483
- } else if ( texture.isVideoTexture ) {
552
+ } else {
484
553
 
485
- const video = texture.source.data;
554
+ if ( mipmaps.length > 0 ) {
486
555
 
487
- textureData.externalTexture = video;
556
+ for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
488
557
 
489
- } else {
558
+ const mipmap = mipmaps[ i ];
490
559
 
491
- this._copyImageToTexture( options.image, textureData.texture, textureDescriptorGPU, 0, texture.flipY, texture.premultiplyAlpha );
560
+ this._copyImageToTexture( mipmap, textureData.texture, textureDescriptorGPU, 0, texture.flipY, texture.premultiplyAlpha, i );
561
+
562
+ }
563
+
564
+
565
+ } else {
566
+
567
+ this._copyImageToTexture( options.image, textureData.texture, textureDescriptorGPU, 0, texture.flipY, texture.premultiplyAlpha );
568
+
569
+ }
492
570
 
493
571
  }
494
572
 
@@ -496,8 +574,6 @@ class WebGPUTextureUtils {
496
574
 
497
575
  textureData.version = texture.version;
498
576
 
499
- if ( texture.onUpdate ) texture.onUpdate( texture );
500
-
501
577
  }
502
578
 
503
579
  /**
@@ -526,7 +602,7 @@ class WebGPUTextureUtils {
526
602
 
527
603
  const readBuffer = device.createBuffer(
528
604
  {
529
- size: width * height * bytesPerTexel,
605
+ size: ( ( height - 1 ) * bytesPerRow ) + ( width * bytesPerTexel ), // see https://github.com/mrdoob/three.js/issues/31658#issuecomment-3229442010
530
606
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
531
607
  }
532
608
  );
@@ -561,6 +637,15 @@ class WebGPUTextureUtils {
561
637
 
562
638
  }
563
639
 
640
+ /**
641
+ * Frees all internal resources.
642
+ */
643
+ dispose() {
644
+
645
+ this._samplerCache.clear();
646
+
647
+ }
648
+
564
649
  /**
565
650
  * Returns the default GPU texture for the given format.
566
651
  *
@@ -616,57 +701,49 @@ class WebGPUTextureUtils {
616
701
  }
617
702
 
618
703
  /**
619
- * Returns the default video frame used as default data in context of video textures.
704
+ * Uploads cube texture image data to the GPU memory.
620
705
  *
621
706
  * @private
622
- * @return {VideoFrame} The video frame.
707
+ * @param {CubeTexture} texture - The cube texture.
708
+ * @param {GPUTexture} textureGPU - The GPU texture.
709
+ * @param {Object} textureDescriptorGPU - The GPU texture descriptor.
623
710
  */
624
- _getDefaultVideoFrame() {
711
+ _copyCubeMapToTexture( texture, textureGPU, textureDescriptorGPU ) {
625
712
 
626
- let defaultVideoFrame = this.defaultVideoFrame;
713
+ const images = texture.images;
714
+ const mipmaps = texture.mipmaps;
627
715
 
628
- if ( defaultVideoFrame === null ) {
716
+ for ( let i = 0; i < 6; i ++ ) {
629
717
 
630
- const init = {
631
- timestamp: 0,
632
- codedWidth: 1,
633
- codedHeight: 1,
634
- format: 'RGBA',
635
- };
718
+ const image = images[ i ];
636
719
 
637
- this.defaultVideoFrame = defaultVideoFrame = new VideoFrame( new Uint8Array( [ 0, 0, 0, 0xff ] ), init );
720
+ const flipIndex = texture.flipY === true ? _flipMap[ i ] : i;
638
721
 
639
- }
722
+ if ( image.isDataTexture ) {
640
723
 
641
- return defaultVideoFrame;
724
+ this._copyBufferToTexture( image.image, textureGPU, textureDescriptorGPU, flipIndex, texture.flipY );
642
725
 
643
- }
726
+ } else {
644
727
 
645
- /**
646
- * Uploads cube texture image data to the GPU memory.
647
- *
648
- * @private
649
- * @param {Array} images - The cube image data.
650
- * @param {GPUTexture} textureGPU - The GPU texture.
651
- * @param {Object} textureDescriptorGPU - The GPU texture descriptor.
652
- * @param {boolean} flipY - Whether to flip texture data along their vertical axis or not.
653
- * @param {boolean} premultiplyAlpha - Whether the texture should have its RGB channels premultiplied by the alpha channel or not.
654
- */
655
- _copyCubeMapToTexture( images, textureGPU, textureDescriptorGPU, flipY, premultiplyAlpha ) {
728
+ this._copyImageToTexture( image, textureGPU, textureDescriptorGPU, flipIndex, texture.flipY, texture.premultiplyAlpha );
656
729
 
657
- for ( let i = 0; i < 6; i ++ ) {
730
+ }
658
731
 
659
- const image = images[ i ];
732
+ for ( let j = 0; j < mipmaps.length; j ++ ) {
660
733
 
661
- const flipIndex = flipY === true ? _flipMap[ i ] : i;
734
+ const mipmap = mipmaps[ j ];
735
+ const image = mipmap.images[ i ];
662
736
 
663
- if ( image.isDataTexture ) {
737
+ if ( image.isDataTexture ) {
664
738
 
665
- this._copyBufferToTexture( image.image, textureGPU, textureDescriptorGPU, flipIndex, flipY );
739
+ this._copyBufferToTexture( image.image, textureGPU, textureDescriptorGPU, flipIndex, texture.flipY, 0, j + 1 );
666
740
 
667
- } else {
741
+ } else {
742
+
743
+ this._copyImageToTexture( image, textureGPU, textureDescriptorGPU, flipIndex, texture.flipY, texture.premultiplyAlpha, j + 1 );
744
+
745
+ }
668
746
 
669
- this._copyImageToTexture( image, textureGPU, textureDescriptorGPU, flipIndex, flipY, premultiplyAlpha );
670
747
 
671
748
  }
672
749
 
@@ -684,23 +761,27 @@ class WebGPUTextureUtils {
684
761
  * @param {number} originDepth - The origin depth.
685
762
  * @param {boolean} flipY - Whether to flip texture data along their vertical axis or not.
686
763
  * @param {boolean} premultiplyAlpha - Whether the texture should have its RGB channels premultiplied by the alpha channel or not.
764
+ * @param {number} [mipLevel=0] - The mip level where the data should be copied to.
687
765
  */
688
- _copyImageToTexture( image, textureGPU, textureDescriptorGPU, originDepth, flipY, premultiplyAlpha ) {
766
+ _copyImageToTexture( image, textureGPU, textureDescriptorGPU, originDepth, flipY, premultiplyAlpha, mipLevel = 0 ) {
689
767
 
690
768
  const device = this.backend.device;
691
769
 
770
+ const width = ( mipLevel > 0 ) ? image.width : textureDescriptorGPU.size.width;
771
+ const height = ( mipLevel > 0 ) ? image.height : textureDescriptorGPU.size.height;
772
+
692
773
  device.queue.copyExternalImageToTexture(
693
774
  {
694
775
  source: image,
695
776
  flipY: flipY
696
777
  }, {
697
778
  texture: textureGPU,
698
- mipLevel: 0,
779
+ mipLevel: mipLevel,
699
780
  origin: { x: 0, y: 0, z: originDepth },
700
781
  premultipliedAlpha: premultiplyAlpha
701
782
  }, {
702
- width: image.width,
703
- height: image.height,
783
+ width: width,
784
+ height: height,
704
785
  depthOrArrayLayers: 1
705
786
  }
706
787
  );
@@ -734,10 +815,11 @@ class WebGPUTextureUtils {
734
815
  * @param {GPUTexture} textureGPU - The GPU texture object.
735
816
  * @param {Object} textureDescriptorGPU - The texture descriptor.
736
817
  * @param {number} [baseArrayLayer=0] - The index of the first array layer accessible to the texture view.
818
+ * @param {?GPUCommandEncoder} [encoder=null] - An optional command encoder used to generate mipmaps.
737
819
  */
738
- _generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer = 0 ) {
820
+ _generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer = 0, encoder = null ) {
739
821
 
740
- this._getPassUtils().generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer );
822
+ this._getPassUtils().generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer, encoder );
741
823
 
742
824
  }
743
825
 
@@ -764,9 +846,10 @@ class WebGPUTextureUtils {
764
846
  * @param {Object} textureDescriptorGPU - The GPU texture descriptor.
765
847
  * @param {number} originDepth - The origin depth.
766
848
  * @param {boolean} flipY - Whether to flip texture data along their vertical axis or not.
767
- * @param {number} [depth=0] - TODO.
849
+ * @param {number} [depth=0] - The depth offset when copying array or 3D texture data.
850
+ * @param {number} [mipLevel=0] - The mip level where the data should be copied to.
768
851
  */
769
- _copyBufferToTexture( image, textureGPU, textureDescriptorGPU, originDepth, flipY, depth = 0 ) {
852
+ _copyBufferToTexture( image, textureGPU, textureDescriptorGPU, originDepth, flipY, depth = 0, mipLevel = 0 ) {
770
853
 
771
854
  // @TODO: Consider to use GPUCommandEncoder.copyBufferToTexture()
772
855
  // @TODO: Consider to support valid buffer layouts with other formats like RGB
@@ -781,7 +864,7 @@ class WebGPUTextureUtils {
781
864
  device.queue.writeTexture(
782
865
  {
783
866
  texture: textureGPU,
784
- mipLevel: 0,
867
+ mipLevel: mipLevel,
785
868
  origin: { x: 0, y: 0, z: originDepth }
786
869
  },
787
870
  data,
@@ -1029,7 +1112,7 @@ class WebGPUTextureUtils {
1029
1112
  if ( format === GPUTextureFormat.RG8Snorm ) return Int8Array;
1030
1113
  if ( format === GPUTextureFormat.RGBA8Uint ) return Uint8Array;
1031
1114
  if ( format === GPUTextureFormat.RGBA8Sint ) return Int8Array;
1032
- if ( format === GPUTextureFormat.RGBA8Unorm ) return Uint8Array;
1115
+ if ( format === GPUTextureFormat.RGBA8Unorm || format === GPUTextureFormat.RGBA8UnormSRGB ) return Uint8Array;
1033
1116
  if ( format === GPUTextureFormat.RGBA8Snorm ) return Int8Array;
1034
1117
 
1035
1118
 
@@ -1054,8 +1137,7 @@ class WebGPUTextureUtils {
1054
1137
  if ( format === GPUTextureFormat.RGBA32Sint ) return Int32Array;
1055
1138
  if ( format === GPUTextureFormat.RGBA32Float ) return Float32Array;
1056
1139
 
1057
- if ( format === GPUTextureFormat.BGRA8Unorm ) return Uint8Array;
1058
- if ( format === GPUTextureFormat.BGRA8UnormSRGB ) return Uint8Array;
1140
+ if ( format === GPUTextureFormat.BGRA8Unorm || format === GPUTextureFormat.BGRA8UnormSRGB ) return Uint8Array;
1059
1141
  if ( format === GPUTextureFormat.RGB10A2Unorm ) return Uint32Array;
1060
1142
  if ( format === GPUTextureFormat.RGB9E5UFloat ) return Uint32Array;
1061
1143
  if ( format === GPUTextureFormat.RG11B10UFloat ) return Uint32Array;
@@ -1078,7 +1160,7 @@ class WebGPUTextureUtils {
1078
1160
 
1079
1161
  let dimension;
1080
1162
 
1081
- if ( texture.isData3DTexture ) {
1163
+ if ( texture.is3DTexture || texture.isData3DTexture ) {
1082
1164
 
1083
1165
  dimension = GPUTextureDimension.ThreeD;
1084
1166
 
@@ -1115,6 +1197,7 @@ export function getFormat( texture, device = null ) {
1115
1197
 
1116
1198
  switch ( format ) {
1117
1199
 
1200
+ case RGB_S3TC_DXT1_Format:
1118
1201
  case RGBA_S3TC_DXT1_Format:
1119
1202
  formatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.BC1RGBAUnormSRGB : GPUTextureFormat.BC1RGBAUnorm;
1120
1203
  break;
@@ -1127,7 +1210,28 @@ export function getFormat( texture, device = null ) {
1127
1210
  formatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.BC3RGBAUnormSRGB : GPUTextureFormat.BC3RGBAUnorm;
1128
1211
  break;
1129
1212
 
1213
+ case RED_RGTC1_Format:
1214
+ formatGPU = GPUTextureFormat.BC4RUnorm;
1215
+ break;
1216
+
1217
+ case SIGNED_RED_RGTC1_Format:
1218
+ formatGPU = GPUTextureFormat.BC4RSnorm;
1219
+ break;
1220
+
1221
+ case RED_GREEN_RGTC2_Format:
1222
+ formatGPU = GPUTextureFormat.BC5RGUnorm;
1223
+ break;
1224
+
1225
+ case SIGNED_RED_GREEN_RGTC2_Format:
1226
+ formatGPU = GPUTextureFormat.BC5RGSnorm;
1227
+ break;
1228
+
1229
+ case RGBA_BPTC_Format:
1230
+ formatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.BC7RGBAUnormSRGB : GPUTextureFormat.BC7RGBAUnorm;
1231
+ break;
1232
+
1130
1233
  case RGB_ETC2_Format:
1234
+ case RGB_ETC1_Format:
1131
1235
  formatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ETC2RGB8UnormSRGB : GPUTextureFormat.ETC2RGB8Unorm;
1132
1236
  break;
1133
1237
 
@@ -1196,7 +1300,7 @@ export function getFormat( texture, device = null ) {
1196
1300
  break;
1197
1301
 
1198
1302
  default:
1199
- console.error( 'WebGPURenderer: Unsupported texture format.', format );
1303
+ error( 'WebGPURenderer: Unsupported texture format.', format );
1200
1304
 
1201
1305
  }
1202
1306
 
@@ -1240,7 +1344,7 @@ export function getFormat( texture, device = null ) {
1240
1344
  break;
1241
1345
 
1242
1346
  default:
1243
- console.error( 'WebGPURenderer: Unsupported texture type with RGBAFormat.', type );
1347
+ error( 'WebGPURenderer: Unsupported texture type with RGBAFormat.', type );
1244
1348
 
1245
1349
  }
1246
1350
 
@@ -1254,8 +1358,12 @@ export function getFormat( texture, device = null ) {
1254
1358
  formatGPU = GPUTextureFormat.RGB9E5UFloat;
1255
1359
  break;
1256
1360
 
1361
+ case UnsignedInt101111Type:
1362
+ formatGPU = GPUTextureFormat.RG11B10UFloat;
1363
+ break;
1364
+
1257
1365
  default:
1258
- console.error( 'WebGPURenderer: Unsupported texture type with RGBFormat.', type );
1366
+ error( 'WebGPURenderer: Unsupported texture type with RGBFormat.', type );
1259
1367
 
1260
1368
  }
1261
1369
 
@@ -1298,7 +1406,7 @@ export function getFormat( texture, device = null ) {
1298
1406
  break;
1299
1407
 
1300
1408
  default:
1301
- console.error( 'WebGPURenderer: Unsupported texture type with RedFormat.', type );
1409
+ error( 'WebGPURenderer: Unsupported texture type with RedFormat.', type );
1302
1410
 
1303
1411
  }
1304
1412
 
@@ -1341,7 +1449,7 @@ export function getFormat( texture, device = null ) {
1341
1449
  break;
1342
1450
 
1343
1451
  default:
1344
- console.error( 'WebGPURenderer: Unsupported texture type with RGFormat.', type );
1452
+ error( 'WebGPURenderer: Unsupported texture type with RGFormat.', type );
1345
1453
 
1346
1454
  }
1347
1455
 
@@ -1364,7 +1472,7 @@ export function getFormat( texture, device = null ) {
1364
1472
  break;
1365
1473
 
1366
1474
  default:
1367
- console.error( 'WebGPURenderer: Unsupported texture type with DepthFormat.', type );
1475
+ error( 'WebGPURenderer: Unsupported texture type with DepthFormat.', type );
1368
1476
 
1369
1477
  }
1370
1478
 
@@ -1382,7 +1490,7 @@ export function getFormat( texture, device = null ) {
1382
1490
 
1383
1491
  if ( device && device.features.has( GPUFeatureName.Depth32FloatStencil8 ) === false ) {
1384
1492
 
1385
- console.error( 'WebGPURenderer: Depth textures with DepthStencilFormat + FloatType can only be used with the "depth32float-stencil8" GPU feature.' );
1493
+ error( 'WebGPURenderer: Depth textures with DepthStencilFormat + FloatType can only be used with the "depth32float-stencil8" GPU feature.' );
1386
1494
 
1387
1495
  }
1388
1496
 
@@ -1391,7 +1499,7 @@ export function getFormat( texture, device = null ) {
1391
1499
  break;
1392
1500
 
1393
1501
  default:
1394
- console.error( 'WebGPURenderer: Unsupported texture type with DepthStencilFormat.', type );
1502
+ error( 'WebGPURenderer: Unsupported texture type with DepthStencilFormat.', type );
1395
1503
 
1396
1504
  }
1397
1505
 
@@ -1410,7 +1518,7 @@ export function getFormat( texture, device = null ) {
1410
1518
  break;
1411
1519
 
1412
1520
  default:
1413
- console.error( 'WebGPURenderer: Unsupported texture type with RedIntegerFormat.', type );
1521
+ error( 'WebGPURenderer: Unsupported texture type with RedIntegerFormat.', type );
1414
1522
 
1415
1523
  }
1416
1524
 
@@ -1429,7 +1537,7 @@ export function getFormat( texture, device = null ) {
1429
1537
  break;
1430
1538
 
1431
1539
  default:
1432
- console.error( 'WebGPURenderer: Unsupported texture type with RGIntegerFormat.', type );
1540
+ error( 'WebGPURenderer: Unsupported texture type with RGIntegerFormat.', type );
1433
1541
 
1434
1542
  }
1435
1543
 
@@ -1448,14 +1556,14 @@ export function getFormat( texture, device = null ) {
1448
1556
  break;
1449
1557
 
1450
1558
  default:
1451
- console.error( 'WebGPURenderer: Unsupported texture type with RGBAIntegerFormat.', type );
1559
+ error( 'WebGPURenderer: Unsupported texture type with RGBAIntegerFormat.', type );
1452
1560
 
1453
1561
  }
1454
1562
 
1455
1563
  break;
1456
1564
 
1457
1565
  default:
1458
- console.error( 'WebGPURenderer: Unsupported texture format.', format );
1566
+ error( 'WebGPURenderer: Unsupported texture format.', format );
1459
1567
 
1460
1568
  }
1461
1569