@plastic-software/three 0.181.3 → 0.183.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 (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -1,5 +1,5 @@
1
1
  import DataMap from '../../common/DataMap.js';
2
- import { GPUTextureViewDimension, GPUIndexFormat, GPUFilterMode, GPUPrimitiveTopology, GPULoadOp, GPUStoreOp } from './WebGPUConstants.js';
2
+ import { GPUFilterMode, GPULoadOp, GPUStoreOp } from './WebGPUConstants.js';
3
3
 
4
4
  /**
5
5
  * A WebGPU backend utility module used by {@link WebGPUTextureUtils}.
@@ -24,65 +24,78 @@ class WebGPUTexturePassUtils extends DataMap {
24
24
  */
25
25
  this.device = device;
26
26
 
27
- const mipmapVertexSource = `
27
+ const mipmapSource = `
28
28
  struct VarysStruct {
29
- @builtin( position ) Position: vec4<f32>,
30
- @location( 0 ) vTex : vec2<f32>
29
+ @builtin( position ) Position: vec4f,
30
+ @location( 0 ) vTex : vec2f,
31
+ @location( 1 ) @interpolate(flat, either) vBaseArrayLayer: u32,
31
32
  };
32
33
 
34
+ @group( 0 ) @binding ( 2 )
35
+ var<uniform> flipY: u32;
36
+
33
37
  @vertex
34
- fn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {
38
+ fn mainVS(
39
+ @builtin( vertex_index ) vertexIndex : u32,
40
+ @builtin( instance_index ) instanceIndex : u32 ) -> VarysStruct {
35
41
 
36
42
  var Varys : VarysStruct;
37
43
 
38
- var pos = array< vec2<f32>, 4 >(
39
- vec2<f32>( -1.0, 1.0 ),
40
- vec2<f32>( 1.0, 1.0 ),
41
- vec2<f32>( -1.0, -1.0 ),
42
- vec2<f32>( 1.0, -1.0 )
43
- );
44
-
45
- var tex = array< vec2<f32>, 4 >(
46
- vec2<f32>( 0.0, 0.0 ),
47
- vec2<f32>( 1.0, 0.0 ),
48
- vec2<f32>( 0.0, 1.0 ),
49
- vec2<f32>( 1.0, 1.0 )
44
+ var pos = array(
45
+ vec2f( -1, -1 ),
46
+ vec2f( -1, 3 ),
47
+ vec2f( 3, -1 ),
50
48
  );
51
49
 
52
- Varys.vTex = tex[ vertexIndex ];
53
- Varys.Position = vec4<f32>( pos[ vertexIndex ], 0.0, 1.0 );
50
+ let p = pos[ vertexIndex ];
51
+ let mult = select( vec2f( 0.5, -0.5 ), vec2f( 0.5, 0.5 ), flipY != 0 );
52
+ Varys.vTex = p * mult + vec2f( 0.5 );
53
+ Varys.Position = vec4f( p, 0, 1 );
54
+ Varys.vBaseArrayLayer = instanceIndex;
54
55
 
55
56
  return Varys;
56
57
 
57
58
  }
58
- `;
59
59
 
60
- const mipmapFragmentSource = `
61
60
  @group( 0 ) @binding( 0 )
62
61
  var imgSampler : sampler;
63
62
 
64
63
  @group( 0 ) @binding( 1 )
65
- var img : texture_2d<f32>;
64
+ var img2d : texture_2d<f32>;
66
65
 
67
66
  @fragment
68
- fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
67
+ fn main_2d( Varys: VarysStruct ) -> @location( 0 ) vec4<f32> {
69
68
 
70
- return textureSample( img, imgSampler, vTex );
69
+ return textureSample( img2d, imgSampler, Varys.vTex );
71
70
 
72
71
  }
73
- `;
74
72
 
75
- const flipYFragmentSource = `
76
- @group( 0 ) @binding( 0 )
77
- var imgSampler : sampler;
73
+ @group( 0 ) @binding( 1 )
74
+ var img2dArray : texture_2d_array<f32>;
75
+
76
+ @fragment
77
+ fn main_2d_array( Varys: VarysStruct ) -> @location( 0 ) vec4<f32> {
78
+
79
+ return textureSample( img2dArray, imgSampler, Varys.vTex, Varys.vBaseArrayLayer );
80
+
81
+ }
82
+
83
+ const faceMat = array(
84
+ mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1 ), // pos-x
85
+ mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1 ), // neg-x
86
+ mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1 ), // pos-y
87
+ mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1 ), // neg-y
88
+ mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1 ), // pos-z
89
+ mat3x3f( -2, 0, 0, 0, -2, 0, 1, 1, -1 ), // neg-z
90
+ );
78
91
 
79
92
  @group( 0 ) @binding( 1 )
80
- var img : texture_2d<f32>;
93
+ var imgCube : texture_cube<f32>;
81
94
 
82
95
  @fragment
83
- fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
96
+ fn main_cube( Varys: VarysStruct ) -> @location( 0 ) vec4<f32> {
84
97
 
85
- return textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );
98
+ return textureSample( imgCube, imgSampler, faceMat[ Varys.vBaseArrayLayer ] * vec3f( fract( Varys.vTex ), 1 ) );
86
99
 
87
100
  }
88
101
  `;
@@ -102,49 +115,40 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
102
115
  this.flipYSampler = device.createSampler( { minFilter: GPUFilterMode.Nearest } ); //@TODO?: Consider using textureLoad()
103
116
 
104
117
  /**
105
- * A cache for GPU render pipelines used for copy/transfer passes.
106
- * Every texture format requires a unique pipeline.
107
- *
108
- * @type {Object<string,GPURenderPipeline>}
118
+ * flip uniform buffer
119
+ * @type {GPUBuffer}
109
120
  */
110
- this.transferPipelines = {};
121
+ this.flipUniformBuffer = device.createBuffer( {
122
+ size: 4,
123
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
124
+ } );
125
+ device.queue.writeBuffer( this.flipUniformBuffer, 0, new Uint32Array( [ 1 ] ) );
111
126
 
112
127
  /**
113
- * A cache for GPU render pipelines used for flipY passes.
114
- * Every texture format requires a unique pipeline.
115
- *
116
- * @type {Object<string,GPURenderPipeline>}
128
+ * no flip uniform buffer
129
+ * @type {GPUBuffer}
117
130
  */
118
- this.flipYPipelines = {};
119
-
120
- /**
121
- * The mipmap vertex shader module.
122
- *
123
- * @type {GPUShaderModule}
124
- */
125
- this.mipmapVertexShaderModule = device.createShaderModule( {
126
- label: 'mipmapVertex',
127
- code: mipmapVertexSource
131
+ this.noFlipUniformBuffer = device.createBuffer( {
132
+ size: 4,
133
+ usage: GPUBufferUsage.UNIFORM
128
134
  } );
129
135
 
130
136
  /**
131
- * The mipmap fragment shader module.
137
+ * A cache for GPU render pipelines used for copy/transfer passes.
138
+ * Every texture format and textureBindingViewDimension combo requires a unique pipeline.
132
139
  *
133
- * @type {GPUShaderModule}
140
+ * @type {Object<string,GPURenderPipeline>}
134
141
  */
135
- this.mipmapFragmentShaderModule = device.createShaderModule( {
136
- label: 'mipmapFragment',
137
- code: mipmapFragmentSource
138
- } );
142
+ this.transferPipelines = {};
139
143
 
140
144
  /**
141
- * The flipY fragment shader module.
145
+ * The mipmap shader module.
142
146
  *
143
147
  * @type {GPUShaderModule}
144
148
  */
145
- this.flipYFragmentShaderModule = device.createShaderModule( {
146
- label: 'flipYFragment',
147
- code: flipYFragmentSource
149
+ this.mipmapShaderModule = device.createShaderModule( {
150
+ label: 'mipmap',
151
+ code: mipmapSource
148
152
  } );
149
153
 
150
154
  }
@@ -154,72 +158,31 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
154
158
  * requires a unique render pipeline for each texture format.
155
159
  *
156
160
  * @param {string} format - The GPU texture format
161
+ * @param {string?} textureBindingViewDimension - The GPU texture binding view dimension
157
162
  * @return {GPURenderPipeline} The GPU render pipeline.
158
163
  */
159
- getTransferPipeline( format ) {
164
+ getTransferPipeline( format, textureBindingViewDimension ) {
160
165
 
161
- let pipeline = this.transferPipelines[ format ];
166
+ textureBindingViewDimension = textureBindingViewDimension || '2d-array';
167
+ const key = `${ format }-${ textureBindingViewDimension }`;
168
+ let pipeline = this.transferPipelines[ key ];
162
169
 
163
170
  if ( pipeline === undefined ) {
164
171
 
165
172
  pipeline = this.device.createRenderPipeline( {
166
- label: `mipmap-${ format }`,
173
+ label: `mipmap-${ format }-${ textureBindingViewDimension }`,
167
174
  vertex: {
168
- module: this.mipmapVertexShaderModule,
169
- entryPoint: 'main'
175
+ module: this.mipmapShaderModule,
170
176
  },
171
177
  fragment: {
172
- module: this.mipmapFragmentShaderModule,
173
- entryPoint: 'main',
178
+ module: this.mipmapShaderModule,
179
+ entryPoint: `main_${ textureBindingViewDimension.replace( '-', '_' ) }`,
174
180
  targets: [ { format } ]
175
181
  },
176
- primitive: {
177
- topology: GPUPrimitiveTopology.TriangleStrip,
178
- stripIndexFormat: GPUIndexFormat.Uint32
179
- },
180
182
  layout: 'auto'
181
183
  } );
182
184
 
183
- this.transferPipelines[ format ] = pipeline;
184
-
185
- }
186
-
187
- return pipeline;
188
-
189
- }
190
-
191
- /**
192
- * Returns a render pipeline for the flipY render pass. The pass
193
- * requires a unique render pipeline for each texture format.
194
- *
195
- * @param {string} format - The GPU texture format
196
- * @return {GPURenderPipeline} The GPU render pipeline.
197
- */
198
- getFlipYPipeline( format ) {
199
-
200
- let pipeline = this.flipYPipelines[ format ];
201
-
202
- if ( pipeline === undefined ) {
203
-
204
- pipeline = this.device.createRenderPipeline( {
205
- label: `flipY-${ format }`,
206
- vertex: {
207
- module: this.mipmapVertexShaderModule,
208
- entryPoint: 'main'
209
- },
210
- fragment: {
211
- module: this.flipYFragmentShaderModule,
212
- entryPoint: 'main',
213
- targets: [ { format } ]
214
- },
215
- primitive: {
216
- topology: GPUPrimitiveTopology.TriangleStrip,
217
- stripIndexFormat: GPUIndexFormat.Uint32
218
- },
219
- layout: 'auto'
220
- } );
221
-
222
- this.flipYPipelines[ format ] = pipeline;
185
+ this.transferPipelines[ key ] = pipeline;
223
186
 
224
187
  }
225
188
 
@@ -239,32 +202,18 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
239
202
  const format = textureGPUDescriptor.format;
240
203
  const { width, height } = textureGPUDescriptor.size;
241
204
 
242
- const transferPipeline = this.getTransferPipeline( format );
243
- const flipYPipeline = this.getFlipYPipeline( format );
244
-
245
205
  const tempTexture = this.device.createTexture( {
246
- size: { width, height, depthOrArrayLayers: 1 },
206
+ size: { width, height },
247
207
  format,
248
208
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
249
209
  } );
250
210
 
251
- const srcView = textureGPU.createView( {
252
- baseMipLevel: 0,
253
- mipLevelCount: 1,
254
- dimension: GPUTextureViewDimension.TwoD,
255
- baseArrayLayer
256
- } );
257
-
258
- const dstView = tempTexture.createView( {
259
- baseMipLevel: 0,
260
- mipLevelCount: 1,
261
- dimension: GPUTextureViewDimension.TwoD,
262
- baseArrayLayer: 0
263
- } );
211
+ const copyTransferPipeline = this.getTransferPipeline( format, textureGPU.textureBindingViewDimension );
212
+ const flipTransferPipeline = this.getTransferPipeline( format, tempTexture.textureBindingViewDimension );
264
213
 
265
214
  const commandEncoder = this.device.createCommandEncoder( {} );
266
215
 
267
- const pass = ( pipeline, sourceView, destinationView ) => {
216
+ const pass = ( pipeline, sourceTexture, sourceArrayLayer, destinationTexture, destinationArrayLayer, flipY ) => {
268
217
 
269
218
  const bindGroupLayout = pipeline.getBindGroupLayout( 0 ); // @TODO: Consider making this static.
270
219
 
@@ -275,28 +224,40 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
275
224
  resource: this.flipYSampler
276
225
  }, {
277
226
  binding: 1,
278
- resource: sourceView
227
+ resource: sourceTexture.createView( {
228
+ dimension: sourceTexture.textureBindingViewDimension || '2d-array',
229
+ baseMipLevel: 0,
230
+ mipLevelCount: 1,
231
+ } ),
232
+ }, {
233
+ binding: 2,
234
+ resource: { buffer: flipY ? this.flipUniformBuffer : this.noFlipUniformBuffer }
279
235
  } ]
280
236
  } );
281
237
 
282
238
  const passEncoder = commandEncoder.beginRenderPass( {
283
239
  colorAttachments: [ {
284
- view: destinationView,
240
+ view: destinationTexture.createView( {
241
+ dimension: '2d',
242
+ baseMipLevel: 0,
243
+ mipLevelCount: 1,
244
+ baseArrayLayer: destinationArrayLayer,
245
+ arrayLayerCount: 1,
246
+ } ),
285
247
  loadOp: GPULoadOp.Clear,
286
248
  storeOp: GPUStoreOp.Store,
287
- clearValue: [ 0, 0, 0, 0 ]
288
249
  } ]
289
250
  } );
290
251
 
291
252
  passEncoder.setPipeline( pipeline );
292
253
  passEncoder.setBindGroup( 0, bindGroup );
293
- passEncoder.draw( 4, 1, 0, 0 );
254
+ passEncoder.draw( 3, 1, 0, sourceArrayLayer );
294
255
  passEncoder.end();
295
256
 
296
257
  };
297
258
 
298
- pass( transferPipeline, srcView, dstView );
299
- pass( flipYPipeline, dstView, srcView );
259
+ pass( copyTransferPipeline, textureGPU, baseArrayLayer, tempTexture, 0, false );
260
+ pass( flipTransferPipeline, tempTexture, 0, textureGPU, baseArrayLayer, true );
300
261
 
301
262
  this.device.queue.submit( [ commandEncoder.finish() ] );
302
263
 
@@ -308,21 +269,13 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
308
269
  * Generates mipmaps for the given GPU texture.
309
270
  *
310
271
  * @param {GPUTexture} textureGPU - The GPU texture object.
311
- * @param {Object} textureGPUDescriptor - The texture descriptor.
312
- * @param {number} [baseArrayLayer=0] - The index of the first array layer accessible to the texture view.
313
272
  * @param {?GPUCommandEncoder} [encoder=null] - An optional command encoder used to generate mipmaps.
314
273
  */
315
- generateMipmaps( textureGPU, textureGPUDescriptor, baseArrayLayer = 0, encoder = null ) {
274
+ generateMipmaps( textureGPU, encoder = null ) {
316
275
 
317
276
  const textureData = this.get( textureGPU );
318
277
 
319
- if ( textureData.layers === undefined ) {
320
-
321
- textureData.layers = [];
322
-
323
- }
324
-
325
- const passes = textureData.layers[ baseArrayLayer ] || this._mipmapCreateBundles( textureGPU, textureGPUDescriptor, baseArrayLayer );
278
+ const passes = textureData.layers || this._mipmapCreateBundles( textureGPU );
326
279
 
327
280
  const commandEncoder = encoder || this.device.createCommandEncoder( { label: 'mipmapEncoder' } );
328
281
 
@@ -330,7 +283,7 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
330
283
 
331
284
  if ( encoder === null ) this.device.queue.submit( [ commandEncoder.finish() ] );
332
285
 
333
- textureData.layers[ baseArrayLayer ] = passes;
286
+ textureData.layers = passes;
334
287
 
335
288
  }
336
289
 
@@ -339,68 +292,67 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
339
292
  * are managed as render bundles to improve performance.
340
293
  *
341
294
  * @param {GPUTexture} textureGPU - The GPU texture object.
342
- * @param {Object} textureGPUDescriptor - The texture descriptor.
343
- * @param {number} baseArrayLayer - The index of the first array layer accessible to the texture view.
344
295
  * @return {Array<Object>} An array of render bundles.
345
296
  */
346
- _mipmapCreateBundles( textureGPU, textureGPUDescriptor, baseArrayLayer ) {
297
+ _mipmapCreateBundles( textureGPU ) {
347
298
 
348
- const pipeline = this.getTransferPipeline( textureGPUDescriptor.format );
299
+ const textureBindingViewDimension = textureGPU.textureBindingViewDimension || '2d-array';
300
+ const pipeline = this.getTransferPipeline( textureGPU.format, textureBindingViewDimension );
349
301
 
350
302
  const bindGroupLayout = pipeline.getBindGroupLayout( 0 ); // @TODO: Consider making this static.
351
303
 
352
- let srcView = textureGPU.createView( {
353
- baseMipLevel: 0,
354
- mipLevelCount: 1,
355
- dimension: GPUTextureViewDimension.TwoD,
356
- baseArrayLayer
357
- } );
358
-
359
304
  const passes = [];
360
305
 
361
- for ( let i = 1; i < textureGPUDescriptor.mipLevelCount; i ++ ) {
362
-
363
- const bindGroup = this.device.createBindGroup( {
364
- layout: bindGroupLayout,
365
- entries: [ {
366
- binding: 0,
367
- resource: this.mipmapSampler
368
- }, {
369
- binding: 1,
370
- resource: srcView
371
- } ]
372
- } );
373
-
374
- const dstView = textureGPU.createView( {
375
- baseMipLevel: i,
376
- mipLevelCount: 1,
377
- dimension: GPUTextureViewDimension.TwoD,
378
- baseArrayLayer
379
- } );
380
-
381
- const passDescriptor = {
382
- colorAttachments: [ {
383
- view: dstView,
384
- loadOp: GPULoadOp.Clear,
385
- storeOp: GPUStoreOp.Store,
386
- clearValue: [ 0, 0, 0, 0 ]
387
- } ]
388
- };
389
-
390
- const passEncoder = this.device.createRenderBundleEncoder( {
391
- colorFormats: [ textureGPUDescriptor.format ]
392
- } );
393
-
394
- passEncoder.setPipeline( pipeline );
395
- passEncoder.setBindGroup( 0, bindGroup );
396
- passEncoder.draw( 4, 1, 0, 0 );
397
-
398
- passes.push( {
399
- renderBundles: [ passEncoder.finish() ],
400
- passDescriptor
401
- } );
402
-
403
- srcView = dstView;
306
+ for ( let baseMipLevel = 1; baseMipLevel < textureGPU.mipLevelCount; baseMipLevel ++ ) {
307
+
308
+ for ( let baseArrayLayer = 0; baseArrayLayer < textureGPU.depthOrArrayLayers; baseArrayLayer ++ ) {
309
+
310
+ const bindGroup = this.device.createBindGroup( {
311
+ layout: bindGroupLayout,
312
+ entries: [ {
313
+ binding: 0,
314
+ resource: this.mipmapSampler
315
+ }, {
316
+ binding: 1,
317
+ resource: textureGPU.createView( {
318
+ dimension: textureBindingViewDimension,
319
+ baseMipLevel: baseMipLevel - 1,
320
+ mipLevelCount: 1,
321
+ } ),
322
+ }, {
323
+ binding: 2,
324
+ resource: { buffer: this.noFlipUniformBuffer }
325
+ } ]
326
+ } );
327
+
328
+ const passDescriptor = {
329
+ colorAttachments: [ {
330
+ view: textureGPU.createView( {
331
+ dimension: '2d',
332
+ baseMipLevel,
333
+ mipLevelCount: 1,
334
+ baseArrayLayer,
335
+ arrayLayerCount: 1,
336
+ } ),
337
+ loadOp: GPULoadOp.Clear,
338
+ storeOp: GPUStoreOp.Store,
339
+ } ]
340
+ };
341
+
342
+ const passEncoder = this.device.createRenderBundleEncoder( {
343
+ colorFormats: [ textureGPU.format ]
344
+ } );
345
+
346
+ passEncoder.setPipeline( pipeline );
347
+ passEncoder.setBindGroup( 0, bindGroup );
348
+ passEncoder.draw( 3, 1, 0, baseArrayLayer );
349
+
350
+ passes.push( {
351
+ renderBundles: [ passEncoder.finish() ],
352
+ passDescriptor
353
+ } );
354
+
355
+ }
404
356
 
405
357
  }
406
358
 
@@ -14,7 +14,9 @@ import {
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
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
+ 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,
19
+ Compatibility
18
20
  } from '../../../constants.js';
19
21
  import { CubeTexture } from '../../../textures/CubeTexture.js';
20
22
  import { Texture } from '../../../textures/Texture.js';
@@ -123,6 +125,15 @@ class WebGPUTextureUtils {
123
125
  maxAnisotropy: 1
124
126
  };
125
127
 
128
+ // Depth textures without compare function must use non-filtering (nearest) sampling
129
+ if ( texture.isDepthTexture && texture.compareFunction === null ) {
130
+
131
+ samplerDescriptorGPU.magFilter = GPUFilterMode.Nearest;
132
+ samplerDescriptorGPU.minFilter = GPUFilterMode.Nearest;
133
+ samplerDescriptorGPU.mipmapFilter = GPUFilterMode.Nearest;
134
+
135
+ }
136
+
126
137
  // anisotropy can only be used when all filter modes are set to linear.
127
138
 
128
139
  if ( samplerDescriptorGPU.magFilter === GPUFilterMode.Linear && samplerDescriptorGPU.minFilter === GPUFilterMode.Linear && samplerDescriptorGPU.mipmapFilter === GPUFilterMode.Linear ) {
@@ -131,7 +142,7 @@ class WebGPUTextureUtils {
131
142
 
132
143
  }
133
144
 
134
- if ( texture.isDepthTexture && texture.compareFunction !== null ) {
145
+ if ( texture.isDepthTexture && texture.compareFunction !== null && backend.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ) {
135
146
 
136
147
  samplerDescriptorGPU.compare = _compareToWebGPU[ texture.compareFunction ];
137
148
 
@@ -301,7 +312,17 @@ class WebGPUTextureUtils {
301
312
 
302
313
  }
303
314
 
304
- textureData.texture = backend.device.createTexture( textureDescriptorGPU );
315
+ try {
316
+
317
+ textureData.texture = backend.device.createTexture( textureDescriptorGPU );
318
+
319
+ } catch ( e ) {
320
+
321
+ warn( 'WebGPURenderer: Failed to create texture with descriptor:', textureDescriptorGPU );
322
+ this.createDefaultTexture( texture );
323
+ return;
324
+
325
+ }
305
326
 
306
327
  if ( isMSAA ) {
307
328
 
@@ -350,25 +371,7 @@ class WebGPUTextureUtils {
350
371
 
351
372
  const textureData = this.backend.get( texture );
352
373
 
353
- if ( texture.isCubeTexture ) {
354
-
355
- for ( let i = 0; i < 6; i ++ ) {
356
-
357
- this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i, encoder );
358
-
359
- }
360
-
361
- } else {
362
-
363
- const depth = texture.image.depth || 1;
364
-
365
- for ( let i = 0; i < depth; i ++ ) {
366
-
367
- this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i, encoder );
368
-
369
- }
370
-
371
- }
374
+ this._generateMipmaps( textureData.texture, encoder );
372
375
 
373
376
  }
374
377
 
@@ -682,7 +685,7 @@ class WebGPUTextureUtils {
682
685
  */
683
686
  _getDefaultCubeTextureGPU( format ) {
684
687
 
685
- let defaultCubeTexture = this.defaultTexture[ format ];
688
+ let defaultCubeTexture = this.defaultCubeTexture[ format ];
686
689
 
687
690
  if ( defaultCubeTexture === undefined ) {
688
691
 
@@ -770,21 +773,27 @@ class WebGPUTextureUtils {
770
773
  const width = ( mipLevel > 0 ) ? image.width : textureDescriptorGPU.size.width;
771
774
  const height = ( mipLevel > 0 ) ? image.height : textureDescriptorGPU.size.height;
772
775
 
773
- device.queue.copyExternalImageToTexture(
774
- {
775
- source: image,
776
- flipY: flipY
777
- }, {
778
- texture: textureGPU,
779
- mipLevel: mipLevel,
780
- origin: { x: 0, y: 0, z: originDepth },
781
- premultipliedAlpha: premultiplyAlpha
782
- }, {
783
- width: width,
784
- height: height,
785
- depthOrArrayLayers: 1
786
- }
787
- );
776
+ try {
777
+
778
+ device.queue.copyExternalImageToTexture(
779
+ {
780
+ source: image,
781
+ flipY: flipY
782
+ }, {
783
+ texture: textureGPU,
784
+ mipLevel: mipLevel,
785
+ origin: { x: 0, y: 0, z: originDepth },
786
+ premultipliedAlpha: premultiplyAlpha
787
+ }, {
788
+ width: width,
789
+ height: height,
790
+ depthOrArrayLayers: 1
791
+ }
792
+ );
793
+
794
+ // try/catch has been added to fix bad video frame data on certain devices, see #32391
795
+
796
+ } catch ( _ ) {}
788
797
 
789
798
  }
790
799
 
@@ -813,13 +822,11 @@ class WebGPUTextureUtils {
813
822
  *
814
823
  * @private
815
824
  * @param {GPUTexture} textureGPU - The GPU texture object.
816
- * @param {Object} textureDescriptorGPU - The texture descriptor.
817
- * @param {number} [baseArrayLayer=0] - The index of the first array layer accessible to the texture view.
818
825
  * @param {?GPUCommandEncoder} [encoder=null] - An optional command encoder used to generate mipmaps.
819
826
  */
820
- _generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer = 0, encoder = null ) {
827
+ _generateMipmaps( textureGPU, encoder = null ) {
821
828
 
822
- this._getPassUtils().generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer, encoder );
829
+ this._getPassUtils().generateMipmaps( textureGPU, encoder );
823
830
 
824
831
  }
825
832
 
@@ -1239,6 +1246,22 @@ export function getFormat( texture, device = null ) {
1239
1246
  formatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ETC2RGBA8UnormSRGB : GPUTextureFormat.ETC2RGBA8Unorm;
1240
1247
  break;
1241
1248
 
1249
+ case R11_EAC_Format:
1250
+ formatGPU = GPUTextureFormat.EACR11Unorm;
1251
+ break;
1252
+
1253
+ case SIGNED_R11_EAC_Format:
1254
+ formatGPU = GPUTextureFormat.EACR11Snorm;
1255
+ break;
1256
+
1257
+ case RG11_EAC_Format:
1258
+ formatGPU = GPUTextureFormat.EACRG11Unorm;
1259
+ break;
1260
+
1261
+ case SIGNED_RG11_EAC_Format:
1262
+ formatGPU = GPUTextureFormat.EACRG11Snorm;
1263
+ break;
1264
+
1242
1265
  case RGBA_ASTC_4x4_Format:
1243
1266
  formatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC4x4UnormSRGB : GPUTextureFormat.ASTC4x4Unorm;
1244
1267
  break;