@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,7 +1,7 @@
1
1
  import { GPUInputStepMode } from './WebGPUConstants.js';
2
2
 
3
3
  import { Float16BufferAttribute } from '../../../core/BufferAttribute.js';
4
- import { error } from '../../../utils.js';
4
+ import { isTypedArray, error } from '../../../utils.js';
5
5
 
6
6
  const typedArraysToVertexFormatPrefix = new Map( [
7
7
  [ Int8Array, [ 'sint8', 'snorm8' ]],
@@ -174,7 +174,6 @@ class WebGPUAttributeUtils {
174
174
  }
175
175
 
176
176
 
177
- const isTypedArray = this._isTypedArray( array );
178
177
  const updateRanges = bufferAttribute.updateRanges;
179
178
 
180
179
  if ( updateRanges.length === 0 ) {
@@ -190,7 +189,8 @@ class WebGPUAttributeUtils {
190
189
 
191
190
  } else {
192
191
 
193
- const byteOffsetFactor = isTypedArray ? 1 : array.BYTES_PER_ELEMENT;
192
+ const isTyped = isTypedArray( array );
193
+ const byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;
194
194
 
195
195
  for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
196
196
 
@@ -211,7 +211,7 @@ class WebGPUAttributeUtils {
211
211
 
212
212
  }
213
213
 
214
- const bufferOffset = dataOffset * ( isTypedArray ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
214
+ const bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
215
215
 
216
216
  device.queue.writeBuffer(
217
217
  buffer,
@@ -415,19 +415,6 @@ class WebGPUAttributeUtils {
415
415
 
416
416
  }
417
417
 
418
- /**
419
- * Returns `true` if the given array is a typed array.
420
- *
421
- * @private
422
- * @param {any} array - The array.
423
- * @return {boolean} Whether the given array is a typed array or not.
424
- */
425
- _isTypedArray( array ) {
426
-
427
- return ArrayBuffer.isView( array ) && ! ( array instanceof DataView );
428
-
429
- }
430
-
431
418
  /**
432
419
  * Utility method for handling interleaved buffer attributes correctly.
433
420
  * To process them, their `InterleavedBuffer` is returned.
@@ -1,11 +1,44 @@
1
1
  import {
2
2
  GPUTextureAspect, GPUTextureViewDimension, GPUTextureSampleType, GPUBufferBindingType, GPUStorageTextureAccess,
3
- GPUSamplerBindingType
3
+ GPUSamplerBindingType, GPUShaderStage
4
4
  } from './WebGPUConstants.js';
5
5
 
6
- import { FloatType, IntType, UnsignedIntType } from '../../../constants.js';
6
+ import { FloatType, IntType, UnsignedIntType, Compatibility } from '../../../constants.js';
7
7
  import { NodeAccess } from '../../../nodes/core/constants.js';
8
- import { error } from '../../../utils.js';
8
+ import { isTypedArray, error } from '../../../utils.js';
9
+ import { hashString } from '../../../nodes/core/NodeUtils.js';
10
+
11
+ /**
12
+ * Class representing a WebGPU bind group layout.
13
+ *
14
+ * @private
15
+ */
16
+ class BindGroupLayout {
17
+
18
+ /**
19
+ * Constructs a new layout.
20
+ *
21
+ * @param {GPUBindGroupLayout} layoutGPU - A GPU Bind Group Layout.
22
+ */
23
+ constructor( layoutGPU ) {
24
+
25
+ /**
26
+ * The current GPUBindGroupLayout.
27
+ *
28
+ * @type {GPUBindGroupLayout}
29
+ */
30
+ this.layoutGPU = layoutGPU;
31
+
32
+ /**
33
+ * The number of bind groups that use this layout.
34
+ *
35
+ * @type {number}
36
+ */
37
+ this.usedTimes = 0;
38
+
39
+ }
40
+
41
+ }
9
42
 
10
43
  /**
11
44
  * A WebGPU backend utility module for managing bindings.
@@ -34,11 +67,12 @@ class WebGPUBindingUtils {
34
67
  this.backend = backend;
35
68
 
36
69
  /**
37
- * A cache for managing bind group layouts.
70
+ * A cache that maps combinations of layout entries to existing bind group layouts.
38
71
  *
39
- * @type {WeakMap<Array<Binding>,GPUBindGroupLayout>}
72
+ * @private
73
+ * @type {Map<string, BindGroupLayout>}
40
74
  */
41
- this.bindGroupLayoutCache = new WeakMap();
75
+ this._bindGroupLayoutCache = new Map();
42
76
 
43
77
  }
44
78
 
@@ -53,185 +87,40 @@ class WebGPUBindingUtils {
53
87
  const backend = this.backend;
54
88
  const device = backend.device;
55
89
 
56
- const entries = [];
57
-
58
- let index = 0;
59
-
60
- for ( const binding of bindGroup.bindings ) {
61
-
62
- const bindingGPU = {
63
- binding: index ++,
64
- visibility: binding.visibility
65
- };
66
-
67
- if ( binding.isUniformBuffer || binding.isStorageBuffer ) {
68
-
69
- const buffer = {}; // GPUBufferBindingLayout
70
-
71
- if ( binding.isStorageBuffer ) {
72
-
73
- if ( binding.visibility & 4 ) {
74
-
75
- // compute
76
-
77
- if ( binding.access === NodeAccess.READ_WRITE || binding.access === NodeAccess.WRITE_ONLY ) {
78
-
79
- buffer.type = GPUBufferBindingType.Storage;
80
-
81
- } else {
82
-
83
- buffer.type = GPUBufferBindingType.ReadOnlyStorage;
84
-
85
- }
86
-
87
- } else {
88
-
89
- buffer.type = GPUBufferBindingType.ReadOnlyStorage;
90
-
91
- }
92
-
93
- }
94
-
95
- bindingGPU.buffer = buffer;
96
-
97
- } else if ( binding.isSampledTexture && binding.store ) {
98
-
99
- const storageTexture = {}; // GPUStorageTextureBindingLayout
100
- storageTexture.format = this.backend.get( binding.texture ).texture.format;
101
-
102
- const access = binding.access;
103
-
104
- if ( access === NodeAccess.READ_WRITE ) {
105
-
106
- storageTexture.access = GPUStorageTextureAccess.ReadWrite;
107
-
108
- } else if ( access === NodeAccess.WRITE_ONLY ) {
109
-
110
- storageTexture.access = GPUStorageTextureAccess.WriteOnly;
111
-
112
- } else {
113
-
114
- storageTexture.access = GPUStorageTextureAccess.ReadOnly;
115
-
116
- }
117
-
118
- if ( binding.texture.isArrayTexture ) {
119
-
120
- storageTexture.viewDimension = GPUTextureViewDimension.TwoDArray;
121
-
122
- } else if ( binding.texture.is3DTexture ) {
123
-
124
- storageTexture.viewDimension = GPUTextureViewDimension.ThreeD;
125
-
126
- }
127
-
128
- bindingGPU.storageTexture = storageTexture;
129
-
130
- } else if ( binding.isSampledTexture ) {
131
-
132
- const texture = {}; // GPUTextureBindingLayout
133
-
134
- const { primarySamples } = backend.utils.getTextureSampleData( binding.texture );
135
-
136
- if ( primarySamples > 1 ) {
137
-
138
- texture.multisampled = true;
139
-
140
- if ( ! binding.texture.isDepthTexture ) {
141
-
142
- texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
143
-
144
- }
145
-
146
- }
147
-
148
- if ( binding.texture.isDepthTexture ) {
149
-
150
- if ( backend.compatibilityMode && binding.texture.compareFunction === null ) {
151
-
152
- texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
153
-
154
- } else {
155
-
156
- texture.sampleType = GPUTextureSampleType.Depth;
157
-
158
- }
159
-
160
- } else if ( binding.texture.isDataTexture || binding.texture.isDataArrayTexture || binding.texture.isData3DTexture ) {
161
-
162
- const type = binding.texture.type;
163
-
164
- if ( type === IntType ) {
165
-
166
- texture.sampleType = GPUTextureSampleType.SInt;
167
-
168
- } else if ( type === UnsignedIntType ) {
169
-
170
- texture.sampleType = GPUTextureSampleType.UInt;
171
-
172
- } else if ( type === FloatType ) {
173
-
174
- if ( this.backend.hasFeature( 'float32-filterable' ) ) {
175
-
176
- texture.sampleType = GPUTextureSampleType.Float;
177
-
178
- } else {
179
-
180
- texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
181
-
182
- }
183
-
184
- }
185
-
186
- }
187
-
188
- if ( binding.isSampledCubeTexture ) {
189
-
190
- texture.viewDimension = GPUTextureViewDimension.Cube;
191
-
192
- } else if ( binding.texture.isArrayTexture || binding.texture.isDataArrayTexture || binding.texture.isCompressedArrayTexture ) {
193
-
194
- texture.viewDimension = GPUTextureViewDimension.TwoDArray;
195
-
196
- } else if ( binding.isSampledTexture3D ) {
197
-
198
- texture.viewDimension = GPUTextureViewDimension.ThreeD;
199
-
200
- }
90
+ const bindingsData = backend.get( bindGroup );
201
91
 
202
- bindingGPU.texture = texture;
92
+ // check if the the bind group already has a layout
203
93
 
204
- } else if ( binding.isSampler ) {
94
+ if ( bindingsData.layout ) {
205
95
 
206
- const sampler = {}; // GPUSamplerBindingLayout
96
+ return bindingsData.layout.layoutGPU;
207
97
 
208
- if ( binding.texture.isDepthTexture ) {
98
+ }
209
99
 
210
- if ( binding.texture.compareFunction !== null ) {
100
+ // if not, assing one
211
101
 
212
- sampler.type = GPUSamplerBindingType.Comparison;
102
+ const entries = this._createLayoutEntries( bindGroup );
103
+ const bindGroupLayoutKey = hashString( JSON.stringify( entries ) );
213
104
 
214
- } else if ( backend.compatibilityMode ) {
105
+ // try to find an existing layout in the cache
215
106
 
216
- sampler.type = GPUSamplerBindingType.NonFiltering;
107
+ let bindGroupLayout = this._bindGroupLayoutCache.get( bindGroupLayoutKey );
217
108
 
218
- }
109
+ // if not create a new one
219
110
 
220
- }
111
+ if ( bindGroupLayout === undefined ) {
221
112
 
222
- bindingGPU.sampler = sampler;
113
+ bindGroupLayout = new BindGroupLayout( device.createBindGroupLayout( { entries } ) );
114
+ this._bindGroupLayoutCache.set( bindGroupLayoutKey, bindGroupLayout );
223
115
 
224
- } else {
225
-
226
- error( `WebGPUBindingUtils: Unsupported binding "${ binding }".` );
227
-
228
- }
116
+ }
229
117
 
230
- entries.push( bindingGPU );
118
+ bindGroupLayout.usedTimes ++;
231
119
 
232
- }
120
+ bindingsData.layout = bindGroupLayout;
121
+ bindingsData.layoutKey = bindGroupLayoutKey;
233
122
 
234
- return device.createBindGroupLayout( { entries } );
123
+ return bindGroupLayout.layoutGPU;
235
124
 
236
125
  }
237
126
 
@@ -245,19 +134,12 @@ class WebGPUBindingUtils {
245
134
  */
246
135
  createBindings( bindGroup, bindings, cacheIndex, version = 0 ) {
247
136
 
248
- const { backend, bindGroupLayoutCache } = this;
137
+ const { backend } = this;
249
138
  const bindingsData = backend.get( bindGroup );
250
139
 
251
140
  // setup (static) binding layout and (dynamic) binding group
252
141
 
253
- let bindLayoutGPU = bindGroupLayoutCache.get( bindGroup.bindingsReference );
254
-
255
- if ( bindLayoutGPU === undefined ) {
256
-
257
- bindLayoutGPU = this.createBindingsLayout( bindGroup );
258
- bindGroupLayoutCache.set( bindGroup.bindingsReference, bindLayoutGPU );
259
-
260
- }
142
+ const bindLayoutGPU = this.createBindingsLayout( bindGroup );
261
143
 
262
144
  let bindGroupGPU;
263
145
 
@@ -292,7 +174,6 @@ class WebGPUBindingUtils {
292
174
  }
293
175
 
294
176
  bindingsData.group = bindGroupGPU;
295
- bindingsData.layout = bindLayoutGPU;
296
177
 
297
178
  }
298
179
 
@@ -306,10 +187,45 @@ class WebGPUBindingUtils {
306
187
  const backend = this.backend;
307
188
  const device = backend.device;
308
189
 
309
- const buffer = binding.buffer;
310
- const bufferGPU = backend.get( binding ).buffer;
190
+ const array = binding.buffer; // cpu
191
+ const buffer = backend.get( binding ).buffer; // gpu
192
+
193
+ const updateRanges = binding.updateRanges;
194
+
195
+ if ( updateRanges.length === 0 ) {
311
196
 
312
- device.queue.writeBuffer( bufferGPU, 0, buffer, 0 );
197
+ device.queue.writeBuffer(
198
+ buffer,
199
+ 0,
200
+ array,
201
+ 0
202
+ );
203
+
204
+ } else {
205
+
206
+ const isTyped = isTypedArray( array );
207
+ const byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;
208
+
209
+ for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
210
+
211
+ const range = updateRanges[ i ];
212
+
213
+ const dataOffset = range.start * byteOffsetFactor;
214
+ const size = range.count * byteOffsetFactor;
215
+
216
+ const bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
217
+
218
+ device.queue.writeBuffer(
219
+ buffer,
220
+ bufferOffset,
221
+ array,
222
+ dataOffset,
223
+ size
224
+ );
225
+
226
+ }
227
+
228
+ }
313
229
 
314
230
  }
315
231
 
@@ -317,10 +233,10 @@ class WebGPUBindingUtils {
317
233
  * Creates a GPU bind group for the camera index.
318
234
  *
319
235
  * @param {Uint32Array} data - The index data.
320
- * @param {GPUBindGroupLayout} layout - The GPU bind group layout.
236
+ * @param {GPUBindGroupLayout} layoutGPU - The GPU bind group layout.
321
237
  * @return {GPUBindGroup} The GPU bind group.
322
238
  */
323
- createBindGroupIndex( data, layout ) {
239
+ createBindGroupIndex( data, layoutGPU ) {
324
240
 
325
241
  const backend = this.backend;
326
242
  const device = backend.device;
@@ -340,7 +256,7 @@ class WebGPUBindingUtils {
340
256
 
341
257
  return device.createBindGroup( {
342
258
  label: 'bindGroupCameraIndex_' + index,
343
- layout,
259
+ layout: layoutGPU,
344
260
  entries
345
261
  } );
346
262
 
@@ -373,8 +289,29 @@ class WebGPUBindingUtils {
373
289
 
374
290
  const usage = GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST;
375
291
 
292
+ const visibilities = [];
293
+ if ( binding.visibility & GPUShaderStage.VERTEX ) {
294
+
295
+ visibilities.push( 'vertex' );
296
+
297
+ }
298
+
299
+ if ( binding.visibility & GPUShaderStage.FRAGMENT ) {
300
+
301
+ visibilities.push( 'fragment' );
302
+
303
+ }
304
+
305
+ if ( binding.visibility & GPUShaderStage.COMPUTE ) {
306
+
307
+ visibilities.push( 'compute' );
308
+
309
+ }
310
+
311
+ const bufferVisibility = `(${visibilities.join( ',' )})`;
312
+
376
313
  const bufferGPU = device.createBuffer( {
377
- label: 'bindingBuffer_' + binding.name,
314
+ label: `bindingBuffer${binding.id}_${binding.name}_${bufferVisibility}`,
378
315
  size: byteLength,
379
316
  usage: usage
380
317
  } );
@@ -387,20 +324,9 @@ class WebGPUBindingUtils {
387
324
 
388
325
  } else if ( binding.isStorageBuffer ) {
389
326
 
390
- const bindingData = backend.get( binding );
391
-
392
- if ( bindingData.buffer === undefined ) {
393
-
394
- const attribute = binding.attribute;
395
- //const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | /*GPUBufferUsage.COPY_SRC |*/ GPUBufferUsage.COPY_DST;
396
-
397
- //backend.attributeUtils.createAttribute( attribute, usage ); // @TODO: Move it to universal renderer
398
-
399
- bindingData.buffer = backend.get( attribute ).buffer;
400
-
401
- }
327
+ const buffer = backend.get( binding.attribute ).buffer;
402
328
 
403
- entriesGPU.push( { binding: bindingPoint, resource: { buffer: bindingData.buffer } } );
329
+ entriesGPU.push( { binding: bindingPoint, resource: { buffer: buffer } } );
404
330
 
405
331
  } else if ( binding.isSampledTexture ) {
406
332
 
@@ -480,6 +406,237 @@ class WebGPUBindingUtils {
480
406
 
481
407
  }
482
408
 
409
+ /**
410
+ * Creates a GPU bind group layout entries for the given bind group.
411
+ *
412
+ * @private
413
+ * @param {BindGroup} bindGroup - The bind group.
414
+ * @return {Array<GPUBindGroupLayoutEntry>} The GPU bind group layout entries.
415
+ */
416
+ _createLayoutEntries( bindGroup ) {
417
+
418
+ const entries = [];
419
+ let index = 0;
420
+
421
+ for ( const binding of bindGroup.bindings ) {
422
+
423
+ const backend = this.backend;
424
+
425
+ const bindingGPU = {
426
+ binding: index,
427
+ visibility: binding.visibility
428
+ };
429
+
430
+ if ( binding.isUniformBuffer || binding.isStorageBuffer ) {
431
+
432
+ const buffer = {}; // GPUBufferBindingLayout
433
+
434
+ if ( binding.isStorageBuffer ) {
435
+
436
+ if ( binding.visibility & GPUShaderStage.COMPUTE ) {
437
+
438
+ // compute
439
+
440
+ if ( binding.access === NodeAccess.READ_WRITE || binding.access === NodeAccess.WRITE_ONLY ) {
441
+
442
+ buffer.type = GPUBufferBindingType.Storage;
443
+
444
+ } else {
445
+
446
+ buffer.type = GPUBufferBindingType.ReadOnlyStorage;
447
+
448
+ }
449
+
450
+ } else {
451
+
452
+ buffer.type = GPUBufferBindingType.ReadOnlyStorage;
453
+
454
+ }
455
+
456
+ }
457
+
458
+ bindingGPU.buffer = buffer;
459
+
460
+ } else if ( binding.isSampledTexture && binding.store ) {
461
+
462
+ const storageTexture = {}; // GPUStorageTextureBindingLayout
463
+ storageTexture.format = this.backend.get( binding.texture ).texture.format;
464
+
465
+ const access = binding.access;
466
+
467
+ if ( access === NodeAccess.READ_WRITE ) {
468
+
469
+ storageTexture.access = GPUStorageTextureAccess.ReadWrite;
470
+
471
+ } else if ( access === NodeAccess.WRITE_ONLY ) {
472
+
473
+ storageTexture.access = GPUStorageTextureAccess.WriteOnly;
474
+
475
+ } else {
476
+
477
+ storageTexture.access = GPUStorageTextureAccess.ReadOnly;
478
+
479
+ }
480
+
481
+ if ( binding.texture.isArrayTexture ) {
482
+
483
+ storageTexture.viewDimension = GPUTextureViewDimension.TwoDArray;
484
+
485
+ } else if ( binding.texture.is3DTexture ) {
486
+
487
+ storageTexture.viewDimension = GPUTextureViewDimension.ThreeD;
488
+
489
+ }
490
+
491
+ bindingGPU.storageTexture = storageTexture;
492
+
493
+ } else if ( binding.isSampledTexture ) {
494
+
495
+ const texture = {}; // GPUTextureBindingLayout
496
+
497
+ const { primarySamples } = backend.utils.getTextureSampleData( binding.texture );
498
+
499
+ if ( primarySamples > 1 ) {
500
+
501
+ texture.multisampled = true;
502
+
503
+ if ( ! binding.texture.isDepthTexture ) {
504
+
505
+ texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
506
+
507
+ }
508
+
509
+ }
510
+
511
+ if ( binding.texture.isDepthTexture ) {
512
+
513
+ if ( backend.compatibilityMode && binding.texture.compareFunction === null ) {
514
+
515
+ texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
516
+
517
+ } else {
518
+
519
+ texture.sampleType = GPUTextureSampleType.Depth;
520
+
521
+ }
522
+
523
+ } else if ( binding.texture.isDataTexture || binding.texture.isDataArrayTexture || binding.texture.isData3DTexture ) {
524
+
525
+ const type = binding.texture.type;
526
+
527
+ if ( type === IntType ) {
528
+
529
+ texture.sampleType = GPUTextureSampleType.SInt;
530
+
531
+ } else if ( type === UnsignedIntType ) {
532
+
533
+ texture.sampleType = GPUTextureSampleType.UInt;
534
+
535
+ } else if ( type === FloatType ) {
536
+
537
+ if ( this.backend.hasFeature( 'float32-filterable' ) ) {
538
+
539
+ texture.sampleType = GPUTextureSampleType.Float;
540
+
541
+ } else {
542
+
543
+ texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
544
+
545
+ }
546
+
547
+ }
548
+
549
+ }
550
+
551
+ if ( binding.isSampledCubeTexture ) {
552
+
553
+ texture.viewDimension = GPUTextureViewDimension.Cube;
554
+
555
+ } else if ( binding.texture.isArrayTexture || binding.texture.isDataArrayTexture || binding.texture.isCompressedArrayTexture ) {
556
+
557
+ texture.viewDimension = GPUTextureViewDimension.TwoDArray;
558
+
559
+ } else if ( binding.isSampledTexture3D ) {
560
+
561
+ texture.viewDimension = GPUTextureViewDimension.ThreeD;
562
+
563
+ }
564
+
565
+ bindingGPU.texture = texture;
566
+
567
+ } else if ( binding.isSampler ) {
568
+
569
+ const sampler = {}; // GPUSamplerBindingLayout
570
+
571
+ if ( binding.texture.isDepthTexture ) {
572
+
573
+ if ( binding.texture.compareFunction !== null && backend.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ) {
574
+
575
+ sampler.type = GPUSamplerBindingType.Comparison;
576
+
577
+ } else {
578
+
579
+ // Depth textures without compare must use non-filtering sampler
580
+ sampler.type = GPUSamplerBindingType.NonFiltering;
581
+
582
+ }
583
+
584
+ }
585
+
586
+ bindingGPU.sampler = sampler;
587
+
588
+ } else {
589
+
590
+ error( `WebGPUBindingUtils: Unsupported binding "${ binding }".` );
591
+
592
+ }
593
+
594
+ entries.push( bindingGPU );
595
+ index ++;
596
+
597
+ }
598
+
599
+ return entries;
600
+
601
+ }
602
+
603
+ /**
604
+ * Delete the data associated with a bind group.
605
+ *
606
+ * @param {BindGroup} bindGroup - The bind group.
607
+ */
608
+ deleteBindGroupData( bindGroup ) {
609
+
610
+ const { backend } = this;
611
+
612
+ const bindingsData = backend.get( bindGroup );
613
+
614
+ if ( bindingsData.layout ) {
615
+
616
+ bindingsData.layout.usedTimes --;
617
+
618
+ if ( bindingsData.layout.usedTimes === 0 ) {
619
+
620
+ this._bindGroupLayoutCache.delete( bindingsData.layoutKey );
621
+
622
+ }
623
+
624
+ bindingsData.layout = undefined;
625
+ bindingsData.layoutKey = undefined;
626
+
627
+ }
628
+
629
+ }
630
+
631
+ /**
632
+ * Frees internal resources.
633
+ */
634
+ dispose() {
635
+
636
+ this._bindGroupLayoutCache.clear();
637
+
638
+ }
639
+
483
640
  }
484
641
 
485
642
  export default WebGPUBindingUtils;
@@ -6,6 +6,8 @@ export const GPUPrimitiveTopology = {
6
6
  TriangleStrip: 'triangle-strip',
7
7
  };
8
8
 
9
+ export const GPUShaderStage = ( typeof self !== 'undefined' && self.GPUShaderStage ) ? self.GPUShaderStage : { VERTEX: 1, FRAGMENT: 2, COMPUTE: 4 };
10
+
9
11
  export const GPUCompareFunction = {
10
12
  Never: 'never',
11
13
  Less: 'less',