super-three 0.184.0 → 0.185.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 (366) hide show
  1. package/build/three.cjs +1260 -927
  2. package/build/three.core.js +1104 -829
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +156 -98
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +11 -4
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +7538 -3367
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +7538 -3366
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +3 -0
  13. package/examples/jsm/controls/ArcballControls.js +6 -2
  14. package/examples/jsm/controls/FirstPersonControls.js +79 -42
  15. package/examples/jsm/controls/TransformControls.js +68 -15
  16. package/examples/jsm/csm/CSMFrustum.js +31 -6
  17. package/examples/jsm/csm/CSMShadowNode.js +4 -1
  18. package/examples/jsm/effects/AsciiEffect.js +14 -1
  19. package/examples/jsm/exporters/DRACOExporter.js +27 -6
  20. package/examples/jsm/exporters/GLTFExporter.js +114 -12
  21. package/examples/jsm/exporters/PLYExporter.js +286 -73
  22. package/examples/jsm/exporters/USDZExporter.js +347 -112
  23. package/examples/jsm/generators/CityGenerator.js +346 -0
  24. package/examples/jsm/generators/ForestGenerator.js +347 -0
  25. package/examples/jsm/generators/TerrainGenerator.js +504 -0
  26. package/examples/jsm/generators/TreeGenerator.js +377 -0
  27. package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
  28. package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
  29. package/examples/jsm/geometries/LoftGeometry.js +355 -0
  30. package/examples/jsm/helpers/LightProbeGridHelper.js +1 -1
  31. package/examples/jsm/helpers/LightProbeHelper.js +5 -4
  32. package/examples/jsm/helpers/ViewHelper.js +16 -6
  33. package/examples/jsm/inspector/Inspector.js +53 -15
  34. package/examples/jsm/inspector/RendererInspector.js +152 -36
  35. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +1 -1
  36. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -1
  37. package/examples/jsm/inspector/tabs/Console.js +200 -18
  38. package/examples/jsm/inspector/tabs/Memory.js +8 -0
  39. package/examples/jsm/inspector/tabs/Parameters.js +64 -4
  40. package/examples/jsm/inspector/tabs/Performance.js +21 -6
  41. package/examples/jsm/inspector/tabs/Settings.js +51 -9
  42. package/examples/jsm/inspector/tabs/Timeline.js +178 -93
  43. package/examples/jsm/inspector/tabs/Viewer.js +628 -16
  44. package/examples/jsm/inspector/ui/Graph.js +162 -25
  45. package/examples/jsm/inspector/ui/Item.js +92 -13
  46. package/examples/jsm/inspector/ui/List.js +1 -1
  47. package/examples/jsm/inspector/ui/Profiler.js +90 -45
  48. package/examples/jsm/inspector/ui/Style.js +1788 -1401
  49. package/examples/jsm/inspector/ui/Tab.js +5 -3
  50. package/examples/jsm/inspector/ui/Values.js +71 -6
  51. package/examples/jsm/inspector/ui/utils.js +130 -10
  52. package/examples/jsm/libs/basis/README.md +0 -1
  53. package/examples/jsm/libs/demuxer_mp4.js +3 -3
  54. package/examples/jsm/libs/draco/README.md +0 -1
  55. package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
  56. package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
  57. package/examples/jsm/libs/mikktspace.module.js +34 -9
  58. package/examples/jsm/lighting/ClusteredLighting.js +55 -0
  59. package/examples/jsm/lighting/LightProbeGrid.js +106 -76
  60. package/examples/jsm/lines/LineMaterial.js +38 -15
  61. package/examples/jsm/lines/LineSegments2.js +8 -0
  62. package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
  63. package/examples/jsm/loaders/3DMLoader.js +1 -1
  64. package/examples/jsm/loaders/DRACOLoader.js +46 -13
  65. package/examples/jsm/loaders/EXRLoader.js +27 -55
  66. package/examples/jsm/loaders/HDRLoader.js +6 -28
  67. package/examples/jsm/loaders/KTX2Loader.js +31 -12
  68. package/examples/jsm/loaders/LDrawLoader.js +8 -8
  69. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  70. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  71. package/examples/jsm/loaders/LWOLoader.js +4 -0
  72. package/examples/jsm/loaders/LottieLoader.js +1 -1
  73. package/examples/jsm/loaders/MaterialXLoader.js +31 -9
  74. package/examples/jsm/loaders/NRRDLoader.js +3 -3
  75. package/examples/jsm/loaders/PCDLoader.js +7 -7
  76. package/examples/jsm/loaders/PLYLoader.js +218 -55
  77. package/examples/jsm/loaders/SVGLoader.js +547 -495
  78. package/examples/jsm/loaders/TTFLoader.js +1 -1
  79. package/examples/jsm/loaders/USDLoader.js +33 -9
  80. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  81. package/examples/jsm/loaders/usd/USDAParser.js +93 -20
  82. package/examples/jsm/loaders/usd/USDCParser.js +1 -1
  83. package/examples/jsm/loaders/usd/USDComposer.js +52 -19
  84. package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
  85. package/examples/jsm/misc/Volume.js +2 -2
  86. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  87. package/examples/jsm/objects/Reflector.js +2 -3
  88. package/examples/jsm/objects/Water2Mesh.js +1 -1
  89. package/examples/jsm/physics/AmmoPhysics.js +15 -8
  90. package/examples/jsm/physics/RapierPhysics.js +27 -2
  91. package/examples/jsm/shaders/VolumeShader.js +31 -44
  92. package/examples/jsm/transpiler/GLSLDecoder.js +6 -6
  93. package/examples/jsm/transpiler/Linker.js +1 -1
  94. package/examples/jsm/tsl/display/BloomNode.js +59 -19
  95. package/examples/jsm/tsl/display/DepthOfFieldNode.js +2 -2
  96. package/examples/jsm/tsl/display/FXAANode.js +11 -12
  97. package/examples/jsm/tsl/display/GTAONode.js +34 -13
  98. package/examples/jsm/tsl/display/GodraysNode.js +1 -1
  99. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
  100. package/examples/jsm/tsl/display/PixelationPassNode.js +2 -2
  101. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
  102. package/examples/jsm/tsl/display/SSAAPassNode.js +13 -25
  103. package/examples/jsm/tsl/display/SSGINode.js +89 -39
  104. package/examples/jsm/tsl/display/SSRNode.js +829 -132
  105. package/examples/jsm/tsl/display/SSSNode.js +2 -2
  106. package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
  107. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
  108. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +1 -1
  109. package/examples/jsm/tsl/math/curlNoise.js +107 -0
  110. package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
  111. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
  112. package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
  113. package/examples/jsm/tsl/utils/RNoise.js +51 -0
  114. package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
  115. package/examples/jsm/utils/BufferGeometryUtils.js +126 -59
  116. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  117. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  118. package/examples/jsm/webxr/ARButton.js +1 -1
  119. package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
  120. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
  121. package/package.json +7 -7
  122. package/src/Three.TSL.js +10 -3
  123. package/src/Three.WebGPU.js +4 -0
  124. package/src/animation/AnimationAction.js +15 -11
  125. package/src/animation/AnimationClip.js +0 -139
  126. package/src/animation/KeyframeTrack.js +2 -2
  127. package/src/animation/PropertyBinding.js +2 -2
  128. package/src/cameras/Camera.js +2 -2
  129. package/src/cameras/StereoCamera.js +5 -2
  130. package/src/constants.js +1 -1
  131. package/src/core/BufferGeometry.js +29 -7
  132. package/src/core/Object3D.js +17 -7
  133. package/src/core/Raycaster.js +1 -1
  134. package/src/core/RenderTarget.js +15 -2
  135. package/src/extras/PMREMGenerator.js +6 -4
  136. package/src/extras/TextureUtils.js +1 -1
  137. package/src/extras/core/ShapePath.js +149 -160
  138. package/src/geometries/SphereGeometry.js +8 -3
  139. package/src/helpers/DirectionalLightHelper.js +2 -0
  140. package/src/helpers/HemisphereLightHelper.js +2 -0
  141. package/src/helpers/PointLightHelper.js +2 -0
  142. package/src/helpers/SpotLightHelper.js +1 -1
  143. package/src/loaders/DataTextureLoader.js +69 -38
  144. package/src/loaders/LoadingManager.js +5 -0
  145. package/src/loaders/MaterialLoader.js +36 -266
  146. package/src/loaders/ObjectLoader.js +3 -1
  147. package/src/materials/LineBasicMaterial.js +4 -0
  148. package/src/materials/Material.js +196 -1
  149. package/src/materials/MeshBasicMaterial.js +24 -0
  150. package/src/materials/MeshDepthMaterial.js +10 -0
  151. package/src/materials/MeshDistanceMaterial.js +10 -0
  152. package/src/materials/MeshLambertMaterial.js +40 -1
  153. package/src/materials/MeshMatcapMaterial.js +25 -1
  154. package/src/materials/MeshNormalMaterial.js +9 -1
  155. package/src/materials/MeshPhongMaterial.js +40 -1
  156. package/src/materials/MeshPhysicalMaterial.js +38 -0
  157. package/src/materials/MeshStandardMaterial.js +42 -1
  158. package/src/materials/MeshToonMaterial.js +34 -1
  159. package/src/materials/PointsMaterial.js +7 -0
  160. package/src/materials/ShaderMaterial.js +86 -0
  161. package/src/materials/SpriteMaterial.js +7 -0
  162. package/src/materials/nodes/Line2NodeMaterial.js +378 -322
  163. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  164. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  165. package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
  166. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +0 -30
  167. package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
  168. package/src/materials/nodes/MeshStandardNodeMaterial.js +0 -11
  169. package/src/materials/nodes/NodeMaterial.js +115 -71
  170. package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
  171. package/src/materials/nodes/manager/NodeMaterialObserver.js +49 -20
  172. package/src/math/Box3.js +5 -0
  173. package/src/math/FrustumArray.js +103 -133
  174. package/src/math/Interpolant.js +1 -1
  175. package/src/math/MathUtils.js +2 -2
  176. package/src/math/Matrix3.js +11 -0
  177. package/src/math/Matrix4.js +28 -3
  178. package/src/math/Vector2.js +2 -2
  179. package/src/math/Vector3.js +2 -2
  180. package/src/math/Vector4.js +2 -2
  181. package/src/math/interpolants/BezierInterpolant.js +4 -6
  182. package/src/nodes/Nodes.js +2 -5
  183. package/src/nodes/TSL.js +8 -6
  184. package/src/nodes/accessors/Arrays.js +4 -4
  185. package/src/nodes/accessors/Batch.js +108 -0
  186. package/src/nodes/accessors/Bitangent.js +2 -2
  187. package/src/nodes/accessors/BufferAttributeNode.js +13 -2
  188. package/src/nodes/accessors/Camera.js +7 -7
  189. package/src/nodes/accessors/ClippingNode.js +1 -1
  190. package/src/nodes/accessors/Instance.js +264 -0
  191. package/src/nodes/accessors/MaterialNode.js +18 -2
  192. package/src/nodes/accessors/MaterialProperties.js +4 -3
  193. package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
  194. package/src/nodes/accessors/Normal.js +13 -13
  195. package/src/nodes/accessors/Position.js +5 -1
  196. package/src/nodes/accessors/ReferenceNode.js +1 -0
  197. package/src/nodes/accessors/ReflectVector.js +3 -3
  198. package/src/nodes/accessors/SceneProperties.js +1 -1
  199. package/src/nodes/accessors/Skinning.js +263 -0
  200. package/src/nodes/accessors/StorageBufferNode.js +2 -2
  201. package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
  202. package/src/nodes/accessors/StorageTextureNode.js +39 -7
  203. package/src/nodes/accessors/Tangent.js +4 -4
  204. package/src/nodes/accessors/TextureNode.js +60 -5
  205. package/src/nodes/code/FunctionNode.js +2 -16
  206. package/src/nodes/core/MRTNode.js +7 -2
  207. package/src/nodes/core/Node.js +39 -2
  208. package/src/nodes/core/NodeBuilder.js +201 -41
  209. package/src/nodes/core/NodeUtils.js +13 -13
  210. package/src/nodes/core/OutputStructNode.js +1 -1
  211. package/src/nodes/core/OverrideContextNode.js +153 -0
  212. package/src/nodes/core/PropertyNode.js +51 -5
  213. package/src/nodes/core/StackNode.js +56 -34
  214. package/src/nodes/core/StructNode.js +4 -6
  215. package/src/nodes/core/StructTypeNode.js +6 -6
  216. package/src/nodes/core/VarNode.js +8 -0
  217. package/src/nodes/core/VaryingNode.js +12 -2
  218. package/src/nodes/display/BlendModes.js +1 -41
  219. package/src/nodes/display/BumpMapNode.js +6 -1
  220. package/src/nodes/display/ColorAdjustment.js +10 -9
  221. package/src/nodes/display/FrontFacingNode.js +38 -9
  222. package/src/nodes/display/NormalMapNode.js +2 -2
  223. package/src/nodes/display/PassNode.js +35 -43
  224. package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
  225. package/src/nodes/display/RenderOutputNode.js +12 -3
  226. package/src/nodes/functions/VolumetricLightingModel.js +40 -7
  227. package/src/nodes/gpgpu/WorkgroupInfoNode.js +1 -1
  228. package/src/nodes/lighting/EnvironmentNode.js +2 -2
  229. package/src/nodes/lighting/IESSpotLightNode.js +40 -2
  230. package/src/nodes/lighting/LightingContextNode.js +10 -2
  231. package/src/nodes/lighting/LightsNode.js +90 -37
  232. package/src/nodes/lighting/PointShadowNode.js +6 -1
  233. package/src/nodes/lighting/ShadowFilterNode.js +21 -52
  234. package/src/nodes/lighting/ShadowNode.js +34 -14
  235. package/src/nodes/materialx/lib/mx_noise.js +2 -2
  236. package/src/nodes/math/ConditionalNode.js +3 -3
  237. package/src/nodes/math/MathNode.js +39 -11
  238. package/src/nodes/math/OperatorNode.js +23 -23
  239. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  240. package/src/nodes/pmrem/PMREMNode.js +33 -2
  241. package/src/nodes/tsl/TSLCore.js +63 -18
  242. package/src/nodes/utils/EquirectUV.js +30 -5
  243. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  244. package/src/nodes/utils/Packing.js +35 -4
  245. package/src/nodes/utils/RTTNode.js +40 -24
  246. package/src/nodes/utils/ReflectorNode.js +1 -0
  247. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  248. package/src/objects/BatchedMesh.js +22 -14
  249. package/src/objects/InstancedMesh.js +0 -11
  250. package/src/objects/Skeleton.js +0 -9
  251. package/src/renderers/WebGLRenderer.js +19 -15
  252. package/src/renderers/common/Backend.js +49 -5
  253. package/src/renderers/common/Bindings.js +114 -45
  254. package/src/renderers/common/Buffer.js +9 -0
  255. package/src/renderers/common/ClippingContext.js +10 -2
  256. package/src/renderers/common/Info.js +63 -22
  257. package/src/renderers/common/Lighting.js +53 -5
  258. package/src/renderers/common/RenderList.js +41 -4
  259. package/src/renderers/common/RenderObject.js +73 -13
  260. package/src/renderers/common/Renderer.js +281 -108
  261. package/src/renderers/common/Sampler.js +16 -48
  262. package/src/renderers/common/Textures.js +32 -5
  263. package/src/renderers/common/TimestampQueryPool.js +1 -1
  264. package/src/renderers/common/UniformsGroup.js +31 -9
  265. package/src/renderers/common/XRManager.js +340 -22
  266. package/src/renderers/common/extras/PMREMGenerator.js +15 -38
  267. package/src/renderers/common/nodes/NodeBuilderState.js +9 -1
  268. package/src/renderers/common/nodes/NodeLibrary.js +4 -4
  269. package/src/renderers/common/nodes/NodeManager.js +63 -14
  270. package/src/renderers/common/nodes/NodeUniformBuffer.js +13 -0
  271. package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
  272. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
  273. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  274. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  275. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
  276. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  277. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +1 -1
  278. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
  279. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
  280. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +1 -1
  281. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  282. package/src/renderers/shaders/ShaderLib/distance.glsl.js +1 -1
  283. package/src/renderers/webgl/WebGLOutput.js +2 -1
  284. package/src/renderers/webgl/WebGLProgram.js +5 -4
  285. package/src/renderers/webgl/WebGLPrograms.js +12 -5
  286. package/src/renderers/webgl/WebGLRenderLists.js +9 -1
  287. package/src/renderers/webgl/WebGLShaderCache.js +5 -11
  288. package/src/renderers/webgl/WebGLTextures.js +20 -7
  289. package/src/renderers/webgl/WebGLUniformsGroups.js +66 -38
  290. package/src/renderers/webgl-fallback/WebGLBackend.js +84 -25
  291. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +138 -8
  292. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +1 -1
  293. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +52 -22
  294. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +4 -2
  295. package/src/renderers/webgpu/WebGPUBackend.js +480 -169
  296. package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
  297. package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
  298. package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
  299. package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
  300. package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
  301. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
  302. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
  303. package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
  304. package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
  305. package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
  306. package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
  307. package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
  308. package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
  309. package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
  310. package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
  311. package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
  312. package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
  313. package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
  314. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
  315. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
  316. package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
  317. package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
  318. package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
  319. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
  320. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +164 -7
  321. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
  322. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +98 -38
  323. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +72 -68
  324. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +164 -69
  325. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +158 -95
  326. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +297 -141
  327. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +33 -18
  328. package/src/renderers/webgpu/utils/WebGPUUtils.js +38 -3
  329. package/src/textures/DepthTexture.js +1 -1
  330. package/src/textures/ExternalTexture.js +0 -3
  331. package/examples/fonts/LICENSE +0 -13
  332. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  333. package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
  334. package/examples/fonts/README.md +0 -11
  335. package/examples/fonts/droid/NOTICE +0 -190
  336. package/examples/fonts/droid/README.txt +0 -18
  337. package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
  338. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
  339. package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
  340. package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
  341. package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
  342. package/examples/fonts/gentilis_bold.typeface.json +0 -1
  343. package/examples/fonts/gentilis_regular.typeface.json +0 -1
  344. package/examples/fonts/helvetiker_bold.typeface.json +0 -1
  345. package/examples/fonts/helvetiker_regular.typeface.json +0 -1
  346. package/examples/fonts/optimer_bold.typeface.json +0 -1
  347. package/examples/fonts/optimer_regular.typeface.json +0 -1
  348. package/examples/fonts/ttf/README.md +0 -9
  349. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  350. package/examples/jsm/inspector/extensions/extensions.json +0 -6
  351. package/examples/jsm/libs/ammo.wasm.js +0 -822
  352. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  353. package/examples/jsm/libs/draco/draco_encoder.js +0 -33
  354. package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
  355. package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
  356. package/examples/jsm/libs/opentype.module.js +0 -14506
  357. package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
  358. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
  359. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  360. package/examples/jsm/lighting/TiledLighting.js +0 -42
  361. package/examples/jsm/tsl/display/AnamorphicNode.js +0 -293
  362. package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
  363. package/src/nodes/accessors/BatchNode.js +0 -163
  364. package/src/nodes/accessors/InstanceNode.js +0 -349
  365. package/src/nodes/accessors/InstancedMeshNode.js +0 -50
  366. package/src/nodes/accessors/SkinningNode.js +0 -328
@@ -4,18 +4,40 @@ import {
4
4
  import { ColorManagement } from '../../../math/ColorManagement.js';
5
5
 
6
6
  import WebGPUTexturePassUtils from './WebGPUTexturePassUtils.js';
7
+ import { submit } from './WebGPUUtils.js';
8
+ import GPUBufferDescriptor from '../descriptors/GPUBufferDescriptor.js';
9
+ import GPUCommandEncoderDescriptor from '../descriptors/GPUCommandEncoderDescriptor.js';
10
+ import GPUSamplerDescriptor from '../descriptors/GPUSamplerDescriptor.js';
11
+ import GPUTexelCopyTextureInfo from '../descriptors/GPUTexelCopyTextureInfo.js';
12
+ import GPUTexelCopyBufferInfo from '../descriptors/GPUTexelCopyBufferInfo.js';
13
+ import GPUTexelCopyBufferLayout from '../descriptors/GPUTexelCopyBufferLayout.js';
14
+ import GPUCopyExternalImageSourceInfo from '../descriptors/GPUCopyExternalImageSourceInfo.js';
15
+ import GPUCopyExternalImageDestInfo from '../descriptors/GPUCopyExternalImageDestInfo.js';
16
+ import GPUTextureDescriptor from '../descriptors/GPUTextureDescriptor.js';
17
+ import GPUExtent3D from '../descriptors/GPUExtent3D.js';
18
+
19
+ const _bufferDescriptor = new GPUBufferDescriptor();
20
+ const _commandEncoderDescriptor = new GPUCommandEncoderDescriptor();
21
+ const _samplerDescriptor = new GPUSamplerDescriptor();
22
+ const _texelCopyTextureInfo = new GPUTexelCopyTextureInfo();
23
+ const _texelCopyBufferInfo = new GPUTexelCopyBufferInfo();
24
+ const _texelCopyBufferLayout = new GPUTexelCopyBufferLayout();
25
+ const _copyExternalImageSourceInfo = new GPUCopyExternalImageSourceInfo();
26
+ const _copyExternalImageDestInfo = new GPUCopyExternalImageDestInfo();
27
+ const _textureDescriptor = new GPUTextureDescriptor();
28
+ const _extent3D = new GPUExtent3D();
7
29
 
8
30
  import {
9
31
  ByteType, ShortType,
10
- NearestFilter, NearestMipmapNearestFilter, NearestMipmapLinearFilter,
32
+ NearestFilter, NearestMipmapNearestFilter, NearestMipmapLinearFilter, LinearMipmapLinearFilter,
11
33
  RepeatWrapping, MirroredRepeatWrapping,
12
34
  RGB_ETC2_Format, RGBA_ETC2_EAC_Format,
13
35
  RGBAFormat, RGBFormat, RedFormat, RGFormat, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, UnsignedByteType, FloatType, HalfFloatType, SRGBTransfer, DepthFormat, DepthStencilFormat,
14
36
  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
37
  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
38
  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,
18
- R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format,
39
+ UnsignedInt101111Type, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_S3TC_DXT1_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format,
40
+ SIGNED_RED_GREEN_RGTC2_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format,
19
41
  Compatibility
20
42
  } from '../../../constants.js';
21
43
  import { CubeTexture } from '../../../textures/CubeTexture.js';
@@ -35,6 +57,32 @@ const _compareToWebGPU = {
35
57
 
36
58
  const _flipMap = [ 0, 1, 3, 2, 4, 5 ];
37
59
 
60
+ function writeTextureLayer( device, textureGPU, mipLevel, layerIndex, mipmap, bytesPerImage, bytesPerRow, rowsPerImage, textureWidth, textureHeight ) {
61
+
62
+ _texelCopyTextureInfo.texture = textureGPU;
63
+ _texelCopyTextureInfo.mipLevel = mipLevel;
64
+ _texelCopyTextureInfo.origin.z = layerIndex;
65
+
66
+ _texelCopyBufferLayout.offset = layerIndex * bytesPerImage;
67
+ _texelCopyBufferLayout.bytesPerRow = bytesPerRow;
68
+ _texelCopyBufferLayout.rowsPerImage = rowsPerImage;
69
+
70
+ _extent3D.width = textureWidth;
71
+ _extent3D.height = textureHeight;
72
+
73
+ device.queue.writeTexture(
74
+ _texelCopyTextureInfo,
75
+ mipmap.data,
76
+ _texelCopyBufferLayout,
77
+ _extent3D
78
+ );
79
+
80
+ _texelCopyTextureInfo.reset();
81
+ _texelCopyBufferLayout.reset();
82
+ _extent3D.reset();
83
+
84
+ }
85
+
38
86
  /**
39
87
  * A WebGPU backend utility module for managing textures.
40
88
  *
@@ -100,55 +148,57 @@ class WebGPUTextureUtils {
100
148
  /**
101
149
  * Creates a GPU sampler for the given texture.
102
150
  *
103
- * @param {Texture} texture - The texture to create the sampler for.
151
+ * @param {Sampler} binding - The sampler binding to update.
104
152
  * @return {string} The current sampler key.
105
153
  */
106
- updateSampler( texture ) {
154
+ updateSampler( binding ) {
107
155
 
108
156
  const backend = this.backend;
157
+ const texture = binding.texture;
158
+ const textureNode = binding.textureNode;
109
159
 
110
160
  const samplerKey = texture.minFilter + '-' + texture.magFilter + '-' +
111
161
  texture.wrapS + '-' + texture.wrapT + '-' + ( texture.wrapR || '0' ) + '-' +
112
- texture.anisotropy + '-' + ( texture.compareFunction || 0 );
162
+ texture.anisotropy + '-' + ( texture.isDepthTexture === true ? 1 : 0 ) + '-' +
163
+ ( texture.compareFunction !== null && textureNode.compareNode !== null ? texture.compareFunction : 0 );
113
164
 
114
165
  let samplerData = this._samplerCache.get( samplerKey );
115
166
 
116
167
  if ( samplerData === undefined ) {
117
168
 
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
- };
169
+ _samplerDescriptor.addressModeU = this._convertAddressMode( texture.wrapS );
170
+ _samplerDescriptor.addressModeV = this._convertAddressMode( texture.wrapT );
171
+ _samplerDescriptor.addressModeW = this._convertAddressMode( texture.wrapR );
172
+ _samplerDescriptor.magFilter = this._convertFilterMode( texture.magFilter );
173
+ _samplerDescriptor.minFilter = this._convertFilterMode( texture.minFilter );
174
+ _samplerDescriptor.mipmapFilter = this._convertMipmapFilterMode( texture.minFilter );
127
175
 
128
176
  // Depth textures without compare function must use non-filtering (nearest) sampling
129
- if ( texture.isDepthTexture && texture.compareFunction === null ) {
177
+ if ( texture.isDepthTexture && ( texture.compareFunction === null || textureNode.compareNode === null ) ) {
130
178
 
131
- samplerDescriptorGPU.magFilter = GPUFilterMode.Nearest;
132
- samplerDescriptorGPU.minFilter = GPUFilterMode.Nearest;
133
- samplerDescriptorGPU.mipmapFilter = GPUFilterMode.Nearest;
179
+ _samplerDescriptor.magFilter = GPUFilterMode.Nearest;
180
+ _samplerDescriptor.minFilter = GPUFilterMode.Nearest;
181
+ _samplerDescriptor.mipmapFilter = GPUFilterMode.Nearest;
134
182
 
135
183
  }
136
184
 
137
185
  // anisotropy can only be used when all filter modes are set to linear.
138
186
 
139
- if ( samplerDescriptorGPU.magFilter === GPUFilterMode.Linear && samplerDescriptorGPU.minFilter === GPUFilterMode.Linear && samplerDescriptorGPU.mipmapFilter === GPUFilterMode.Linear ) {
187
+ if ( _samplerDescriptor.magFilter === GPUFilterMode.Linear && _samplerDescriptor.minFilter === GPUFilterMode.Linear && _samplerDescriptor.mipmapFilter === GPUFilterMode.Linear ) {
140
188
 
141
- samplerDescriptorGPU.maxAnisotropy = texture.anisotropy;
189
+ _samplerDescriptor.maxAnisotropy = texture.anisotropy;
142
190
 
143
191
  }
144
192
 
145
- if ( texture.isDepthTexture && texture.compareFunction !== null && backend.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ) {
193
+ if ( texture.isDepthTexture && texture.compareFunction !== null && textureNode.compareNode !== null && backend.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ) {
146
194
 
147
- samplerDescriptorGPU.compare = _compareToWebGPU[ texture.compareFunction ];
195
+ _samplerDescriptor.compare = _compareToWebGPU[ texture.compareFunction ];
148
196
 
149
197
  }
150
198
 
151
- const sampler = backend.device.createSampler( samplerDescriptorGPU );
199
+ const sampler = backend.device.createSampler( _samplerDescriptor );
200
+
201
+ _samplerDescriptor.reset();
152
202
 
153
203
  samplerData = { sampler, usedTimes: 0 };
154
204
 
@@ -156,35 +206,62 @@ class WebGPUTextureUtils {
156
206
 
157
207
  }
158
208
 
159
- const textureData = backend.get( texture );
209
+ const bindingData = backend.get( binding );
160
210
 
161
- if ( textureData.sampler !== samplerData.sampler ) {
211
+ if ( bindingData.sampler !== samplerData.sampler ) {
162
212
 
163
- // check if previous sampler is unused so it can be deleted
213
+ // release the previous sampler (if any) so it can be deleted when unused
164
214
 
165
- if ( textureData.sampler !== undefined ) {
215
+ this._releaseSampler( bindingData );
166
216
 
167
- const oldSamplerData = this._samplerCache.get( textureData.samplerKey );
168
- oldSamplerData.usedTimes --;
217
+ // update to new sampler data
169
218
 
170
- if ( oldSamplerData.usedTimes === 0 ) {
219
+ bindingData.samplerKey = samplerKey;
220
+ bindingData.sampler = samplerData.sampler;
171
221
 
172
- this._samplerCache.delete( textureData.samplerKey );
222
+ samplerData.usedTimes ++;
173
223
 
174
- }
224
+ }
175
225
 
176
- }
226
+ return samplerKey;
177
227
 
178
- // update to new sampler data
228
+ }
179
229
 
180
- textureData.samplerKey = samplerKey;
181
- textureData.sampler = samplerData.sampler;
230
+ /**
231
+ * Frees the GPU sampler referenced by the given sampler binding.
232
+ *
233
+ * @param {Sampler} binding - The sampler binding to free.
234
+ */
235
+ destroySampler( binding ) {
182
236
 
183
- samplerData.usedTimes ++;
237
+ this._releaseSampler( this.backend.get( binding ) );
184
238
 
185
- }
239
+ }
186
240
 
187
- return samplerKey;
241
+ /**
242
+ * Releases the pooled sampler referenced by the given binding data and
243
+ * removes it from the cache when no binding references it anymore.
244
+ *
245
+ * @private
246
+ * @param {Object} bindingData - The binding data holding the sampler reference.
247
+ */
248
+ _releaseSampler( bindingData ) {
249
+
250
+ if ( bindingData.sampler !== undefined ) {
251
+
252
+ const samplerData = this._samplerCache.get( bindingData.samplerKey );
253
+ samplerData.usedTimes --;
254
+
255
+ if ( samplerData.usedTimes === 0 ) {
256
+
257
+ this._samplerCache.delete( bindingData.samplerKey );
258
+
259
+ }
260
+
261
+ bindingData.sampler = undefined;
262
+ bindingData.samplerKey = undefined;
263
+
264
+ }
188
265
 
189
266
  }
190
267
 
@@ -227,7 +304,14 @@ class WebGPUTextureUtils {
227
304
 
228
305
  if ( textureData.initialized ) {
229
306
 
230
- throw new Error( 'WebGPUTextureUtils: Texture already initialized.' );
307
+ // Skip creation for external XR textures - they are already set up
308
+ if ( textureData.externalTexture === true ) {
309
+
310
+ return;
311
+
312
+ }
313
+
314
+ throw new Error( 'THREE.WebGPUTextureUtils: Texture already initialized.' );
231
315
 
232
316
  }
233
317
 
@@ -281,19 +365,16 @@ class WebGPUTextureUtils {
281
365
 
282
366
  }
283
367
 
284
- const textureDescriptorGPU = {
285
- label: texture.name,
286
- size: {
287
- width: width,
288
- height: height,
289
- depthOrArrayLayers: depth,
290
- },
291
- mipLevelCount: levels,
292
- sampleCount: primarySamples,
293
- dimension: dimension,
294
- format: format,
295
- usage: usage
296
- };
368
+ const textureDescriptorGPU = new GPUTextureDescriptor();
369
+ textureDescriptorGPU.label = texture.name;
370
+ textureDescriptorGPU.size.width = width;
371
+ textureDescriptorGPU.size.height = height;
372
+ textureDescriptorGPU.size.depthOrArrayLayers = depth;
373
+ textureDescriptorGPU.mipLevelCount = levels;
374
+ textureDescriptorGPU.sampleCount = primarySamples;
375
+ textureDescriptorGPU.dimension = dimension;
376
+ textureDescriptorGPU.format = format;
377
+ textureDescriptorGPU.usage = usage;
297
378
 
298
379
  // texture creation
299
380
 
@@ -353,7 +434,7 @@ class WebGPUTextureUtils {
353
434
  const backend = this.backend;
354
435
  const textureData = backend.get( texture );
355
436
 
356
- if ( textureData.texture !== undefined && isDefaultTexture === false ) textureData.texture.destroy();
437
+ if ( textureData.texture !== undefined && isDefaultTexture === false && texture.isExternalTexture !== true ) textureData.texture.destroy();
357
438
 
358
439
  if ( textureData.msaaTexture !== undefined ) textureData.msaaTexture.destroy();
359
440
 
@@ -403,17 +484,16 @@ class WebGPUTextureUtils {
403
484
 
404
485
  if ( colorBuffer ) colorBuffer.destroy();
405
486
 
406
- colorBuffer = backend.device.createTexture( {
407
- label: 'colorBuffer',
408
- size: {
409
- width: width,
410
- height: height,
411
- depthOrArrayLayers: 1
412
- },
413
- sampleCount: backend.utils.getSampleCount( backend.renderer.currentSamples ),
414
- format: backend.utils.getPreferredCanvasFormat(),
415
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
416
- } );
487
+ _textureDescriptor.label = 'colorBuffer';
488
+ _textureDescriptor.size.width = width;
489
+ _textureDescriptor.size.height = height;
490
+ _textureDescriptor.sampleCount = backend.utils.getSampleCount( backend.renderer.currentSamples );
491
+ _textureDescriptor.format = backend.utils.getPreferredCanvasFormat();
492
+ _textureDescriptor.usage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC;
493
+
494
+ colorBuffer = backend.device.createTexture( _textureDescriptor );
495
+
496
+ _textureDescriptor.reset();
417
497
 
418
498
  //
419
499
 
@@ -560,7 +640,17 @@ class WebGPUTextureUtils {
560
640
 
561
641
  } else if ( texture.isCompressedTexture || texture.isCompressedArrayTexture ) {
562
642
 
563
- this._copyCompressedBufferToTexture( texture.mipmaps, textureData.texture, textureDescriptorGPU );
643
+ if ( texture.isCompressedArrayTexture && texture.layerUpdates.size > 0 ) {
644
+
645
+ this._copyCompressedBufferToTexture( texture.mipmaps, textureData.texture, textureDescriptorGPU, texture.layerUpdates );
646
+
647
+ texture.clearLayerUpdates();
648
+
649
+ } else {
650
+
651
+ this._copyCompressedBufferToTexture( texture.mipmaps, textureData.texture, textureDescriptorGPU );
652
+
653
+ }
564
654
 
565
655
  } else if ( texture.isCubeTexture ) {
566
656
 
@@ -586,10 +676,29 @@ class WebGPUTextureUtils {
586
676
  const width = textureDescriptorGPU.size.width;
587
677
  const height = textureDescriptorGPU.size.height;
588
678
 
589
- device.queue.copyElementImageToTexture(
590
- image, width, height,
591
- { texture: textureData.texture }
592
- );
679
+ if ( device.queue.copyElementImageToTexture.length === 2 ) {
680
+
681
+ // Chrome 150+
682
+
683
+ device.queue.copyElementImageToTexture(
684
+ { source: image },
685
+ {
686
+ destination: { texture: textureData.texture },
687
+ width: width,
688
+ height: height
689
+ }
690
+ );
691
+
692
+ } else {
693
+
694
+ // Chrome 138 - 149
695
+
696
+ device.queue.copyElementImageToTexture(
697
+ image, width, height,
698
+ { texture: textureData.texture }
699
+ );
700
+
701
+ }
593
702
 
594
703
  if ( texture.flipY ) {
595
704
 
@@ -648,34 +757,39 @@ class WebGPUTextureUtils {
648
757
  let bytesPerRow = width * bytesPerTexel;
649
758
  bytesPerRow = Math.ceil( bytesPerRow / 256 ) * 256; // Align to 256 bytes
650
759
 
651
- const readBuffer = device.createBuffer(
652
- {
653
- size: ( ( height - 1 ) * bytesPerRow ) + ( width * bytesPerTexel ), // see https://github.com/mrdoob/three.js/issues/31658#issuecomment-3229442010
654
- usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
655
- }
656
- );
760
+ _bufferDescriptor.size = ( ( height - 1 ) * bytesPerRow ) + ( width * bytesPerTexel ); // see https://github.com/mrdoob/three.js/issues/31658#issuecomment-3229442010
761
+ _bufferDescriptor.usage = GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ;
657
762
 
658
- const encoder = device.createCommandEncoder();
763
+ const readBuffer = device.createBuffer( _bufferDescriptor );
659
764
 
660
- encoder.copyTextureToBuffer(
661
- {
662
- texture: textureGPU,
663
- origin: { x, y, z: faceIndex },
664
- },
665
- {
666
- buffer: readBuffer,
667
- bytesPerRow: bytesPerRow
668
- },
669
- {
670
- width: width,
671
- height: height
672
- }
765
+ _bufferDescriptor.reset();
766
+
767
+ const encoder = device.createCommandEncoder( _commandEncoderDescriptor );
768
+
769
+ _texelCopyTextureInfo.texture = textureGPU;
770
+ _texelCopyTextureInfo.origin.x = x;
771
+ _texelCopyTextureInfo.origin.y = y;
772
+ _texelCopyTextureInfo.origin.z = faceIndex;
673
773
 
774
+ _texelCopyBufferInfo.buffer = readBuffer;
775
+ _texelCopyBufferInfo.bytesPerRow = bytesPerRow;
776
+
777
+ _extent3D.width = width;
778
+ _extent3D.height = height;
779
+
780
+ encoder.copyTextureToBuffer(
781
+ _texelCopyTextureInfo,
782
+ _texelCopyBufferInfo,
783
+ _extent3D
674
784
  );
675
785
 
786
+ _texelCopyTextureInfo.reset();
787
+ _texelCopyBufferInfo.reset();
788
+ _extent3D.reset();
789
+
676
790
  const typedArrayType = this._getTypedArrayType( format );
677
791
 
678
- device.queue.submit( [ encoder.finish() ] );
792
+ submit( device, encoder.finish() );
679
793
 
680
794
  await readBuffer.mapAsync( GPUMapMode.READ );
681
795
 
@@ -820,27 +934,36 @@ class WebGPUTextureUtils {
820
934
  const width = ( mipLevel > 0 ) ? image.width : textureDescriptorGPU.size.width;
821
935
  const height = ( mipLevel > 0 ) ? image.height : textureDescriptorGPU.size.height;
822
936
 
937
+ _copyExternalImageSourceInfo.source = image;
938
+ _copyExternalImageSourceInfo.flipY = flipY;
939
+
940
+ _copyExternalImageDestInfo.texture = textureGPU;
941
+ _copyExternalImageDestInfo.mipLevel = mipLevel;
942
+ _copyExternalImageDestInfo.origin.z = originDepth;
943
+ _copyExternalImageDestInfo.premultipliedAlpha = premultiplyAlpha;
944
+
945
+ _extent3D.width = width;
946
+ _extent3D.height = height;
947
+
823
948
  try {
824
949
 
825
950
  device.queue.copyExternalImageToTexture(
826
- {
827
- source: image,
828
- flipY: flipY
829
- }, {
830
- texture: textureGPU,
831
- mipLevel: mipLevel,
832
- origin: { x: 0, y: 0, z: originDepth },
833
- premultipliedAlpha: premultiplyAlpha
834
- }, {
835
- width: width,
836
- height: height,
837
- depthOrArrayLayers: 1
838
- }
951
+ _copyExternalImageSourceInfo,
952
+ _copyExternalImageDestInfo,
953
+ _extent3D
839
954
  );
840
955
 
841
956
  // try/catch has been added to fix bad video frame data on certain devices, see #32391
842
957
 
843
- } catch ( _ ) {}
958
+ } catch ( _ ) {
959
+
960
+ } finally {
961
+
962
+ _copyExternalImageSourceInfo.reset();
963
+ _copyExternalImageDestInfo.reset();
964
+ _extent3D.reset();
965
+
966
+ }
844
967
 
845
968
  }
846
969
 
@@ -915,22 +1038,26 @@ class WebGPUTextureUtils {
915
1038
  const bytesPerTexel = this._getBytesPerTexel( textureDescriptorGPU.format );
916
1039
  const bytesPerRow = image.width * bytesPerTexel;
917
1040
 
1041
+ _texelCopyTextureInfo.texture = textureGPU;
1042
+ _texelCopyTextureInfo.mipLevel = mipLevel;
1043
+ _texelCopyTextureInfo.origin.z = originDepth;
1044
+
1045
+ _texelCopyBufferLayout.offset = image.width * image.height * bytesPerTexel * depth;
1046
+ _texelCopyBufferLayout.bytesPerRow = bytesPerRow;
1047
+
1048
+ _extent3D.width = image.width;
1049
+ _extent3D.height = image.height;
1050
+
918
1051
  device.queue.writeTexture(
919
- {
920
- texture: textureGPU,
921
- mipLevel: mipLevel,
922
- origin: { x: 0, y: 0, z: originDepth }
923
- },
1052
+ _texelCopyTextureInfo,
924
1053
  data,
925
- {
926
- offset: image.width * image.height * bytesPerTexel * depth,
927
- bytesPerRow
928
- },
929
- {
930
- width: image.width,
931
- height: image.height,
932
- depthOrArrayLayers: 1
933
- } );
1054
+ _texelCopyBufferLayout,
1055
+ _extent3D
1056
+ );
1057
+
1058
+ _texelCopyTextureInfo.reset();
1059
+ _texelCopyBufferLayout.reset();
1060
+ _extent3D.reset();
934
1061
 
935
1062
  if ( flipY === true ) {
936
1063
 
@@ -947,8 +1074,9 @@ class WebGPUTextureUtils {
947
1074
  * @param {Array<Object>} mipmaps - An array with mipmap data.
948
1075
  * @param {GPUTexture} textureGPU - The GPU texture.
949
1076
  * @param {Object} textureDescriptorGPU - The GPU texture descriptor.
1077
+ * @param {?Set<number>} [layerUpdates=null] - The layer indices to update.
950
1078
  */
951
- _copyCompressedBufferToTexture( mipmaps, textureGPU, textureDescriptorGPU ) {
1079
+ _copyCompressedBufferToTexture( mipmaps, textureGPU, textureDescriptorGPU, layerUpdates = null ) {
952
1080
 
953
1081
  // @TODO: Consider to use GPUCommandEncoder.copyBufferToTexture()
954
1082
 
@@ -956,6 +1084,7 @@ class WebGPUTextureUtils {
956
1084
 
957
1085
  const blockData = this._getBlockData( textureDescriptorGPU.format );
958
1086
  const isArrayTexture = textureDescriptorGPU.size.depthOrArrayLayers > 1;
1087
+ const activeLayerUpdates = layerUpdates && layerUpdates.size > 0 ? layerUpdates : null;
959
1088
 
960
1089
  for ( let i = 0; i < mipmaps.length; i ++ ) {
961
1090
 
@@ -966,28 +1095,26 @@ class WebGPUTextureUtils {
966
1095
  const depth = isArrayTexture ? textureDescriptorGPU.size.depthOrArrayLayers : 1;
967
1096
 
968
1097
  const bytesPerRow = Math.ceil( width / blockData.width ) * blockData.byteLength;
969
- const bytesPerImage = bytesPerRow * Math.ceil( height / blockData.height );
1098
+ const rowsPerImage = Math.ceil( height / blockData.height );
1099
+ const bytesPerImage = bytesPerRow * rowsPerImage;
1100
+ const textureWidth = Math.ceil( width / blockData.width ) * blockData.width;
1101
+ const textureHeight = rowsPerImage * blockData.height;
970
1102
 
971
- for ( let j = 0; j < depth; j ++ ) {
1103
+ if ( activeLayerUpdates !== null ) {
972
1104
 
973
- device.queue.writeTexture(
974
- {
975
- texture: textureGPU,
976
- mipLevel: i,
977
- origin: { x: 0, y: 0, z: j }
978
- },
979
- mipmap.data,
980
- {
981
- offset: j * bytesPerImage,
982
- bytesPerRow,
983
- rowsPerImage: Math.ceil( height / blockData.height )
984
- },
985
- {
986
- width: Math.ceil( width / blockData.width ) * blockData.width,
987
- height: Math.ceil( height / blockData.height ) * blockData.height,
988
- depthOrArrayLayers: 1
989
- }
990
- );
1105
+ for ( const layerIndex of activeLayerUpdates ) {
1106
+
1107
+ writeTextureLayer( device, textureGPU, i, layerIndex, mipmap, bytesPerImage, bytesPerRow, rowsPerImage, textureWidth, textureHeight );
1108
+
1109
+ }
1110
+
1111
+ } else {
1112
+
1113
+ for ( let layerIndex = 0; layerIndex < depth; layerIndex ++ ) {
1114
+
1115
+ writeTextureLayer( device, textureGPU, i, layerIndex, mipmap, bytesPerImage, bytesPerRow, rowsPerImage, textureWidth, textureHeight );
1116
+
1117
+ }
991
1118
 
992
1119
  }
993
1120
 
@@ -1084,6 +1211,27 @@ class WebGPUTextureUtils {
1084
1211
 
1085
1212
  }
1086
1213
 
1214
+ /**
1215
+ * Converts the three.js filter constants to a GPU mipmap filter constant.
1216
+ * Unlike `_convertFilterMode`, this extracts the between-mip-level filtering
1217
+ * axis from the combined three.js constant rather than the within-level axis.
1218
+ *
1219
+ * @private
1220
+ * @param {number} value - The three.js constant defining a filter mode.
1221
+ * @return {string} The GPU mipmap filter mode.
1222
+ */
1223
+ _convertMipmapFilterMode( value ) {
1224
+
1225
+ if ( value === NearestMipmapLinearFilter || value === LinearMipmapLinearFilter ) {
1226
+
1227
+ return GPUFilterMode.Linear;
1228
+
1229
+ }
1230
+
1231
+ return GPUFilterMode.Nearest;
1232
+
1233
+ }
1234
+
1087
1235
  /**
1088
1236
  * Returns the bytes-per-texel value for the given GPU texture format.
1089
1237
  *
@@ -1310,6 +1458,14 @@ export function getFormat( texture, device ) {
1310
1458
  formatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.BC7RGBAUnormSRGB : GPUTextureFormat.BC7RGBAUnorm;
1311
1459
  break;
1312
1460
 
1461
+ case RGB_BPTC_SIGNED_Format:
1462
+ formatGPU = GPUTextureFormat.BC6HRGBFloat;
1463
+ break;
1464
+
1465
+ case RGB_BPTC_UNSIGNED_Format:
1466
+ formatGPU = GPUTextureFormat.BC6HRGBUFloat;
1467
+ break;
1468
+
1313
1469
  case RGB_ETC2_Format:
1314
1470
  case RGB_ETC1_Format:
1315
1471
  formatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ETC2RGB8UnormSRGB : GPUTextureFormat.ETC2RGB8Unorm;