super-three 0.181.0 → 0.184.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -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
207
-
208
- if ( binding.texture.isDepthTexture ) {
96
+ return bindingsData.layout.layoutGPU;
209
97
 
210
- if ( binding.texture.compareFunction !== null ) {
98
+ }
211
99
 
212
- sampler.type = GPUSamplerBindingType.Comparison;
100
+ // if not, assing one
213
101
 
214
- } else if ( backend.compatibilityMode ) {
102
+ const entries = this._createLayoutEntries( bindGroup );
103
+ const bindGroupLayoutKey = hashString( JSON.stringify( entries ) );
215
104
 
216
- sampler.type = GPUSamplerBindingType.NonFiltering;
105
+ // try to find an existing layout in the cache
217
106
 
218
- }
107
+ let bindGroupLayout = this._bindGroupLayoutCache.get( bindGroupLayoutKey );
219
108
 
220
- }
109
+ // if not create a new one
221
110
 
222
- bindingGPU.sampler = sampler;
111
+ if ( bindGroupLayout === undefined ) {
223
112
 
224
- } else {
113
+ bindGroupLayout = new BindGroupLayout( device.createBindGroupLayout( { entries } ) );
114
+ this._bindGroupLayoutCache.set( bindGroupLayoutKey, bindGroupLayout );
225
115
 
226
- error( `WebGPUBindingUtils: Unsupported binding "${ binding }".` );
116
+ }
227
117
 
228
- }
118
+ bindGroupLayout.usedTimes ++;
229
119
 
230
- entries.push( bindingGPU );
120
+ bindingsData.layout = bindGroupLayout;
121
+ bindingsData.layoutKey = bindGroupLayoutKey;
231
122
 
232
- }
233
-
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 ) {
196
+
197
+ device.queue.writeBuffer(
198
+ buffer,
199
+ 0,
200
+ array,
201
+ 0
202
+ );
311
203
 
312
- device.queue.writeBuffer( bufferGPU, 0, buffer, 0 );
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 || binding.texture.isStorageTexture ) {
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;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * A WebGPU backend utility module for managing the device's capabilities.
3
+ *
4
+ * @private
5
+ */
6
+ class WebGPUCapabilities {
7
+
8
+ /**
9
+ * Constructs a new utility object.
10
+ *
11
+ * @param {WebGPUBackend} backend - The WebGPU backend.
12
+ */
13
+ constructor( backend ) {
14
+
15
+ /**
16
+ * A reference to the WebGPU backend.
17
+ *
18
+ * @type {WebGPUBackend}
19
+ */
20
+ this.backend = backend;
21
+
22
+ }
23
+
24
+ /**
25
+ * Returns the maximum anisotropy texture filtering value.
26
+ *
27
+ * @return {number} The maximum anisotropy texture filtering value.
28
+ */
29
+ getMaxAnisotropy() {
30
+
31
+ return 16;
32
+
33
+ }
34
+
35
+ /**
36
+ * Returns the maximum number of bytes available for uniform buffers.
37
+ *
38
+ * @return {number} The maximum number of bytes available for uniform buffers.
39
+ */
40
+ getUniformBufferLimit() {
41
+
42
+ return this.backend.device.limits.maxUniformBufferBindingSize;
43
+
44
+ }
45
+
46
+ }
47
+
48
+ export default WebGPUCapabilities;