@gnsx/three 0.185.15 → 0.186.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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -16,7 +16,7 @@ import { NodeAccess } from '../../../nodes/core/constants.js';
16
16
  import VarNode from '../../../nodes/core/VarNode.js';
17
17
  import ExpressionNode from '../../../nodes/code/ExpressionNode.js';
18
18
 
19
- import { FloatType, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, Compatibility } from '../../../constants.js';
19
+ import { FloatType, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, Compatibility, ShortType, UnsignedShortType } from '../../../constants.js';
20
20
  import { warn, error } from '../../../utils.js';
21
21
 
22
22
  import { GPUShaderStage } from '../utils/WebGPUConstants.js';
@@ -231,15 +231,49 @@ const wgslMethods = {
231
231
  inverse_mat3: 'tsl_inverse_mat3',
232
232
  inverse_mat4: 'tsl_inverse_mat4',
233
233
  inversesqrt: 'inverseSqrt',
234
+ faceforward: 'faceForward',
234
235
  bitcast: 'bitcast<f32>',
235
236
  floatpack_snorm_2x16: 'pack2x16snorm',
236
237
  floatpack_unorm_2x16: 'pack2x16unorm',
237
238
  floatpack_float16_2x16: 'pack2x16float',
239
+ floatpack_snorm_4x8: 'pack4x8snorm',
240
+ floatpack_unorm_4x8: 'pack4x8unorm',
238
241
  floatunpack_snorm_2x16: 'unpack2x16snorm',
239
242
  floatunpack_unorm_2x16: 'unpack2x16unorm',
240
- floatunpack_float16_2x16: 'unpack2x16float'
243
+ floatunpack_float16_2x16: 'unpack2x16float',
244
+ floatunpack_snorm_4x8: 'unpack4x8snorm',
245
+ floatunpack_unorm_4x8: 'unpack4x8unorm'
241
246
  };
242
247
 
248
+ // See: https://www.w3.org/TR/WGSL/#keyword-summary and #reserved-words-section
249
+
250
+ const wgslReservedKeywords = new Set( [
251
+ // keywords
252
+ 'alias', 'break', 'case', 'const', 'const_assert', 'continue', 'continuing', 'default', 'diagnostic',
253
+ 'discard', 'else', 'enable', 'false', 'fn', 'for', 'if', 'let', 'loop', 'override', 'requires',
254
+ 'return', 'struct', 'switch', 'true', 'var', 'while',
255
+ // reserved words
256
+ 'NULL', 'Self', 'abstract', 'active', 'alignas', 'alignof', 'as', 'asm', 'asm_fragment', 'async',
257
+ 'attribute', 'auto', 'await', 'become', 'binding_array', 'cast', 'catch', 'class', 'co_await',
258
+ 'co_return', 'co_yield', 'coherent', 'column_major', 'common', 'compile', 'compile_fragment',
259
+ 'concept', 'const_cast', 'consteval', 'constexpr', 'constinit', 'crate', 'debugger', 'decltype',
260
+ 'delete', 'demote', 'demote_to_helper', 'do', 'dynamic_cast', 'enum', 'explicit', 'export',
261
+ 'extends', 'extern', 'external', 'fallthrough', 'filter', 'final', 'finally', 'friend', 'from',
262
+ 'fxgroup', 'get', 'goto', 'groupshared', 'highp', 'impl', 'implements', 'import', 'inline',
263
+ 'instanceof', 'interface', 'layout', 'lowp', 'macro', 'macro_rules', 'match', 'mediump', 'meta',
264
+ 'mod', 'module', 'move', 'mut', 'mutable', 'namespace', 'new', 'nil', 'noexcept', 'noinline',
265
+ 'nointerpolation', 'non_coherent', 'noncoherent', 'noperspective', 'null', 'nullptr', 'of',
266
+ 'operator', 'package', 'packoffset', 'partition', 'pass', 'patch', 'pixelfragment', 'precise',
267
+ 'precision', 'premerge', 'priv', 'protected', 'pub', 'public', 'readonly', 'ref', 'regardless',
268
+ 'register', 'reinterpret_cast', 'require', 'resource', 'restrict', 'self', 'set', 'shared',
269
+ 'sizeof', 'smooth', 'snorm', 'static', 'static_assert', 'static_cast', 'std', 'subroutine',
270
+ 'super', 'target', 'template', 'this', 'thread_local', 'throw', 'trait', 'try', 'type', 'typedef',
271
+ 'typeid', 'typename', 'typeof', 'union', 'unless', 'unorm', 'unsafe', 'unsized', 'use', 'using',
272
+ 'varying', 'virtual', 'volatile', 'wgsl', 'where', 'with', 'writeonly', 'yield',
273
+ // generated entry points
274
+ 'main'
275
+ ] );
276
+
243
277
  //
244
278
 
245
279
  let diagnostics = '';
@@ -590,6 +624,25 @@ class WGSLNodeBuilder extends NodeBuilder {
590
624
 
591
625
  }
592
626
 
627
+ /**
628
+ * Generates the WGSL snippet that resolves the dimensions of the given texture.
629
+ *
630
+ * @param {Texture} texture - The texture.
631
+ * @param {string} textureProperty - The name of the texture uniform in the shader.
632
+ * @param {string} levelSnippet - A WGSL snippet that represents the mip level.
633
+ * @return {string} The WGSL snippet.
634
+ */
635
+ generateTextureSize( texture, textureProperty, levelSnippet ) {
636
+
637
+ const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
638
+ const isMultisampled = primarySamples > 1;
639
+
640
+ const params = ( isMultisampled || texture.isStorageTexture ) ? textureProperty : `${ textureProperty }, ${ levelSnippet }`;
641
+
642
+ return `textureDimensions( ${ params } )`;
643
+
644
+ }
645
+
593
646
  /**
594
647
  * Generates the WGSL snippet for a manual filtered texture.
595
648
  *
@@ -806,7 +859,8 @@ class WGSLNodeBuilder extends NodeBuilder {
806
859
  return this.getComponentTypeFromTexture( texture ) !== 'float' ||
807
860
  ( ! this.isAvailable( 'float32Filterable' ) && texture.type === FloatType ) ||
808
861
  ( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) ||
809
- this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1;
862
+ this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1 ||
863
+ texture.normalized === true && ( texture.type === ShortType || texture.type === UnsignedShortType );
810
864
 
811
865
  }
812
866
 
@@ -939,7 +993,6 @@ class WGSLNodeBuilder extends NodeBuilder {
939
993
  * @param {string} gatherSnippet - A WGSL snippet that represents the index of the channel to read.
940
994
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
941
995
  * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
942
- * @param {?string} flipYSnippet - A WGSL snippet that represents the y-flip. Only used for WebGL.
943
996
  * @return {string} The WGSL snippet.
944
997
  */
945
998
  generateTextureGather( texture, textureProperty, uvSnippet, gatherSnippet, depthSnippet, offsetSnippet ) {
@@ -977,7 +1030,6 @@ class WGSLNodeBuilder extends NodeBuilder {
977
1030
  * @param {string} compareSnippet - A WGSL snippet that represents the reference value.
978
1031
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
979
1032
  * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
980
- * @param {?string} flipYSnippet - A WGSL snippet that represents the y-flip. Only used for WebGL.
981
1033
  * @return {string} The WGSL snippet.
982
1034
  */
983
1035
  generateTextureGatherCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, offsetSnippet ) {
@@ -1013,7 +1065,6 @@ class WGSLNodeBuilder extends NodeBuilder {
1013
1065
  * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
1014
1066
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
1015
1067
  * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
1016
- * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
1017
1068
  * @return {string} The WGSL snippet.
1018
1069
  */
1019
1070
  generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
@@ -1148,6 +1199,18 @@ class WGSLNodeBuilder extends NodeBuilder {
1148
1199
 
1149
1200
  }
1150
1201
 
1202
+ /**
1203
+ * Returns whether the given name is a reserved keyword of WGSL.
1204
+ *
1205
+ * @param {string} name - The name to test.
1206
+ * @return {boolean} Whether the name is a reserved keyword or not.
1207
+ */
1208
+ isReservedKeyword( name ) {
1209
+
1210
+ return wgslReservedKeywords.has( name );
1211
+
1212
+ }
1213
+
1151
1214
  /**
1152
1215
  * Returns the output struct name.
1153
1216
  *
@@ -1194,7 +1257,16 @@ class WGSLNodeBuilder extends NodeBuilder {
1194
1257
 
1195
1258
  if ( node.isAtomic === true ) {
1196
1259
 
1197
- warn( 'WebGPURenderer: Atomic operations are only supported in compute shaders.' );
1260
+ // Per the WGSL spec, atomic built-in functions are only allowed in
1261
+ // the fragment and compute stages, not in the vertex stage.
1262
+
1263
+ if ( shaderStage === 'vertex' ) {
1264
+
1265
+ warn( 'WebGPURenderer: Atomic operations are not supported in the vertex stage. They are only available in the fragment and compute stages.' );
1266
+
1267
+ return NodeAccess.READ_ONLY;
1268
+
1269
+ }
1198
1270
 
1199
1271
  return NodeAccess.READ_WRITE;
1200
1272
 
@@ -1730,9 +1802,10 @@ ${ flowData.code }
1730
1802
  * @param {string} scope - The scope.
1731
1803
  * @param {string} bufferType - The buffer type.
1732
1804
  * @param {string} bufferCount - The buffer count.
1805
+ * @param {boolean} isAtomic - Whether the array elements are atomic or not.
1733
1806
  * @return {string} The array name.
1734
1807
  */
1735
- getScopedArray( name, scope, bufferType, bufferCount ) {
1808
+ getScopedArray( name, scope, bufferType, bufferCount, isAtomic ) {
1736
1809
 
1737
1810
  if ( this.scopedArrays.has( name ) === false ) {
1738
1811
 
@@ -1740,7 +1813,8 @@ ${ flowData.code }
1740
1813
  name,
1741
1814
  scope,
1742
1815
  bufferType,
1743
- bufferCount
1816
+ bufferCount,
1817
+ isAtomic
1744
1818
  } );
1745
1819
 
1746
1820
  }
@@ -1766,9 +1840,11 @@ ${ flowData.code }
1766
1840
 
1767
1841
  const snippets = [];
1768
1842
 
1769
- for ( const { name, scope, bufferType, bufferCount } of this.scopedArrays.values() ) {
1843
+ for ( const { name, scope, bufferType, bufferCount, isAtomic } of this.scopedArrays.values() ) {
1844
+
1845
+ let type = this.getType( bufferType );
1770
1846
 
1771
- const type = this.getType( bufferType );
1847
+ if ( isAtomic === true ) type = `atomic<${type}>`;
1772
1848
 
1773
1849
  snippets.push( `var<${scope}> ${name}: array< ${type}, ${bufferCount} >;` );
1774
1850
 
@@ -2072,7 +2148,7 @@ ${ flowData.code }
2072
2148
 
2073
2149
  if ( needsSampler ) {
2074
2150
 
2075
- if ( this.isSampleCompare( texture ) && textureNode.compareNode !== null ) {
2151
+ if ( this.isSampleCompare( texture ) && textureNode.isSampleCompare() ) {
2076
2152
 
2077
2153
  bindingSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var ${ uniform.name }_sampler : sampler_comparison;` );
2078
2154
 
@@ -2130,11 +2206,13 @@ ${ flowData.code }
2130
2206
 
2131
2207
  } else if ( texture.isArrayTexture === true || texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {
2132
2208
 
2133
- textureType = 'texture_2d_array<f32>';
2209
+ const componentPrefix = this.getComponentTypeFromTexture( texture ).charAt( 0 );
2210
+ textureType = `texture_2d_array<${ componentPrefix }32>`;
2134
2211
 
2135
2212
  } else if ( texture.is3DTexture === true || texture.isData3DTexture === true ) {
2136
2213
 
2137
- textureType = 'texture_3d<f32>';
2214
+ const componentPrefix = this.getComponentTypeFromTexture( texture ).charAt( 0 );
2215
+ textureType = `texture_3d<${ componentPrefix }32>`;
2138
2216
 
2139
2217
  } else {
2140
2218
 
@@ -2337,8 +2415,7 @@ ${ flowData.code }
2337
2415
  } else {
2338
2416
 
2339
2417
  // Early strictly validated in computeNode
2340
-
2341
- const workgroupSize = this.object.workgroupSize;
2418
+ const workgroupSize = this.compute.workgroupSize;
2342
2419
 
2343
2420
  this.computeShader = this._getWGSLComputeCode( shadersData.compute, workgroupSize );
2344
2421
 
@@ -2391,11 +2468,12 @@ ${ flowData.code }
2391
2468
  * Returns the float packing method name for a given numeric encoding.
2392
2469
  *
2393
2470
  * @param {string} encoding - The numeric encoding that describes how the float values are mapped to the integer range.
2471
+ * @param {string} [layout='2x16'] - The component layout of the packed integer.
2394
2472
  * @returns {string} The resolve WGSL float packing method name.
2395
2473
  */
2396
- getFloatPackingMethod( encoding ) {
2474
+ getFloatPackingMethod( encoding, layout = '2x16' ) {
2397
2475
 
2398
- return this.getMethod( `floatpack_${ encoding }_2x16` );
2476
+ return this.getMethod( `floatpack_${ encoding }_${ layout }` );
2399
2477
 
2400
2478
  }
2401
2479
 
@@ -2403,11 +2481,12 @@ ${ flowData.code }
2403
2481
  * Returns the float unpacking method name for a given numeric encoding.
2404
2482
  *
2405
2483
  * @param {string} encoding - The numeric encoding that describes how the integer values are mapped to the float range.
2484
+ * @param {string} [layout='2x16'] - The component layout of the packed integer.
2406
2485
  * @returns {string} The resolve WGSL float unpacking method name.
2407
2486
  */
2408
- getFloatUnpackingMethod( encoding ) {
2487
+ getFloatUnpackingMethod( encoding, layout = '2x16' ) {
2409
2488
 
2410
- return this.getMethod( `floatunpack_${ encoding }_2x16` );
2489
+ return this.getMethod( `floatunpack_${ encoding }_${ layout }` );
2411
2490
 
2412
2491
  }
2413
2492
 
@@ -50,6 +50,7 @@ const wgslTypeLib = {
50
50
  'mat4x4f': 'mat4',
51
51
 
52
52
  'sampler': 'sampler',
53
+ 'sampler_comparison': 'samplerComparison',
53
54
 
54
55
  'texture_1d': 'texture',
55
56
 
@@ -77,7 +78,7 @@ const wgslTypeLib = {
77
78
 
78
79
  const parse = ( source ) => {
79
80
 
80
- source = source.trim();
81
+ source = source.replace( /^(?:\s*\/\/[^\r\n]*|\s*\/\*[\s\S]*?\*\/|\s*)+/, '' );
81
82
 
82
83
  const declaration = source.match( declarationRegexp );
83
84
 
@@ -14,8 +14,8 @@ const typedArraysToVertexFormatPrefix = new Map( [
14
14
  [ Uint8Array, [ 'uint8', 'unorm8' ]],
15
15
  [ Int16Array, [ 'sint16', 'snorm16' ]],
16
16
  [ Uint16Array, [ 'uint16', 'unorm16' ]],
17
- [ Int32Array, [ 'sint32', 'snorm32' ]],
18
- [ Uint32Array, [ 'uint32', 'unorm32' ]],
17
+ [ Int32Array, [ 'sint32' ]],
18
+ [ Uint32Array, [ 'uint32' ]],
19
19
  [ Float32Array, [ 'float32', ]],
20
20
  ] );
21
21
 
@@ -31,9 +31,7 @@ const typedAttributeToVertexFormatPrefix = new Map( [
31
31
 
32
32
  const typeArraysToVertexFormatPrefixForItemSize1 = new Map( [
33
33
  [ Int32Array, 'sint32' ],
34
- [ Int16Array, 'sint32' ], // patch for INT16
35
34
  [ Uint32Array, 'uint32' ],
36
- [ Uint16Array, 'uint32' ], // patch for UINT16
37
35
  [ Float32Array, 'float32' ]
38
36
  ] );
39
37
 
@@ -82,7 +80,7 @@ class WebGPUAttributeUtils {
82
80
  let array = bufferAttribute.array;
83
81
 
84
82
  // patch for INT16 and UINT16
85
- if ( attribute.normalized === false ) {
83
+ if ( attribute.normalized === false && attribute.isInterleavedBufferAttribute !== true ) {
86
84
 
87
85
  if ( array.constructor === Int16Array || array.constructor === Int8Array ) {
88
86
 
@@ -321,13 +319,6 @@ class WebGPUAttributeUtils {
321
319
 
322
320
  }
323
321
 
324
- // patch for INT16 and UINT16
325
- if ( geometryAttribute.normalized === false && ( geometryAttribute.array.constructor === Int16Array || geometryAttribute.array.constructor === Uint16Array ) ) {
326
-
327
- arrayStride = 4;
328
-
329
- }
330
-
331
322
  vertexBufferLayout = {
332
323
  arrayStride,
333
324
  attributes: [],
@@ -3,7 +3,7 @@ import {
3
3
  GPUSamplerBindingType, GPUShaderStage
4
4
  } from './WebGPUConstants.js';
5
5
 
6
- import { FloatType, IntType, UnsignedIntType, Compatibility } from '../../../constants.js';
6
+ import { FloatType, IntType, UnsignedIntType, Compatibility, UnsignedShortType, ShortType } from '../../../constants.js';
7
7
  import { NodeAccess } from '../../../nodes/core/constants.js';
8
8
  import { isTypedArray, error } from '../../../utils.js';
9
9
  import { hashString } from '../../../nodes/core/NodeUtils.js';
@@ -137,10 +137,10 @@ class WebGPUBindingUtils {
137
137
  *
138
138
  * @param {BindGroup} bindGroup - The bind group.
139
139
  * @param {Array<BindGroup>} bindings - Array of bind groups.
140
- * @param {number} cacheIndex - The cache index.
140
+ * @param {string} cacheKey - The cache key.
141
141
  * @param {number} version - The version.
142
142
  */
143
- createBindings( bindGroup, bindings, cacheIndex, version = 0 ) {
143
+ createBindings( bindGroup, bindings, cacheKey, version = 0 ) {
144
144
 
145
145
  const { backend } = this;
146
146
  const bindingsData = backend.get( bindGroup );
@@ -151,18 +151,18 @@ class WebGPUBindingUtils {
151
151
 
152
152
  let bindGroupGPU;
153
153
 
154
- if ( cacheIndex > 0 ) {
154
+ if ( cacheKey !== '' ) {
155
155
 
156
156
  if ( bindingsData.groups === undefined ) {
157
157
 
158
- bindingsData.groups = [];
159
- bindingsData.versions = [];
158
+ bindingsData.groups = {};
159
+ bindingsData.versions = {};
160
160
 
161
161
  }
162
162
 
163
- if ( bindingsData.versions[ cacheIndex ] === version ) {
163
+ if ( bindingsData.versions[ cacheKey ] === version ) {
164
164
 
165
- bindGroupGPU = bindingsData.groups[ cacheIndex ];
165
+ bindGroupGPU = bindingsData.groups[ cacheKey ];
166
166
 
167
167
  }
168
168
 
@@ -172,10 +172,10 @@ class WebGPUBindingUtils {
172
172
 
173
173
  bindGroupGPU = this.createBindGroup( bindGroup, bindLayoutGPU );
174
174
 
175
- if ( cacheIndex > 0 ) {
175
+ if ( cacheKey !== '' ) {
176
176
 
177
- bindingsData.groups[ cacheIndex ] = bindGroupGPU;
178
- bindingsData.versions[ cacheIndex ] = version;
177
+ bindingsData.groups[ cacheKey ] = bindGroupGPU;
178
+ bindingsData.versions[ cacheKey ] = version;
179
179
 
180
180
  }
181
181
 
@@ -439,8 +439,6 @@ class WebGPUBindingUtils {
439
439
 
440
440
  if ( binding.visibility & GPUShaderStage.COMPUTE ) {
441
441
 
442
- // compute
443
-
444
442
  if ( binding.access === NodeAccess.READ_WRITE || binding.access === NodeAccess.WRITE_ONLY ) {
445
443
 
446
444
  buffer.type = GPUBufferBindingType.Storage;
@@ -451,6 +449,14 @@ class WebGPUBindingUtils {
451
449
 
452
450
  }
453
451
 
452
+ } else if ( binding.nodeUniform && binding.nodeUniform.isAtomic && ( binding.visibility & GPUShaderStage.FRAGMENT ) ) {
453
+
454
+ // Atomic buffers require a read_write storage binding. Per the WGSL
455
+ // spec this is only valid in the fragment stage (compute is handled
456
+ // above), so the vertex stage falls back to read-only storage.
457
+
458
+ buffer.type = GPUBufferBindingType.Storage;
459
+
454
460
  } else {
455
461
 
456
462
  buffer.type = GPUBufferBindingType.ReadOnlyStorage;
@@ -536,6 +542,10 @@ class WebGPUBindingUtils {
536
542
 
537
543
  texture.sampleType = GPUTextureSampleType.UInt;
538
544
 
545
+ } else if ( binding.texture.normalized === true && ( type === ShortType || type === UnsignedShortType ) ) {
546
+
547
+ texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
548
+
539
549
  } else if ( type === FloatType ) {
540
550
 
541
551
  if ( this.backend.hasFeature( 'float32-filterable' ) ) {
@@ -574,7 +584,7 @@ class WebGPUBindingUtils {
574
584
 
575
585
  if ( binding.texture.isDepthTexture ) {
576
586
 
577
- if ( binding.texture.compareFunction !== null && binding.textureNode.compareNode !== null && backend.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ) {
587
+ if ( binding.texture.compareFunction !== null && binding.textureNode.isSampleCompare() && backend.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ) {
578
588
 
579
589
  sampler.type = GPUSamplerBindingType.Comparison;
580
590
 
@@ -1,5 +1,3 @@
1
- import { BlendColorFactor, OneMinusBlendColorFactor, } from '../../common/Constants.js';
2
-
3
1
  import {
4
2
  GPUFrontFace, GPUCullMode, GPUColorWriteFlags, GPUCompareFunction, GPUBlendFactor, GPUBlendOperation, GPUIndexFormat, GPUStencilOperation, GPUPrimitiveTopology
5
3
  } from './WebGPUConstants.js';
@@ -10,6 +8,7 @@ import {
10
8
  NoBlending, NormalBlending, AdditiveBlending, SubtractiveBlending, MultiplyBlending, CustomBlending, MaterialBlending,
11
9
  ZeroFactor, OneFactor, SrcColorFactor, OneMinusSrcColorFactor, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstColorFactor,
12
10
  OneMinusDstColorFactor, DstAlphaFactor, OneMinusDstAlphaFactor, SrcAlphaSaturateFactor,
11
+ ConstantColorFactor, OneMinusConstantColorFactor, ConstantAlphaFactor, OneMinusConstantAlphaFactor,
13
12
  AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation,
14
13
  KeepStencilOp, ZeroStencilOp, ReplaceStencilOp, InvertStencilOp, IncrementStencilOp, DecrementStencilOp, IncrementWrapStencilOp, DecrementWrapStencilOp,
15
14
  NeverStencilFunc, AlwaysStencilFunc, LessStencilFunc, LessEqualStencilFunc, EqualStencilFunc, GreaterEqualStencilFunc, GreaterStencilFunc, NotEqualStencilFunc
@@ -376,8 +375,9 @@ class WebGPUPipelineUtils {
376
375
  *
377
376
  * @param {ComputePipeline} pipeline - The compute pipeline.
378
377
  * @param {Array<BindGroup>} bindings - The bindings.
378
+ * @param {?Array<Promise>} [promises=null] - Optional compilation promises.
379
379
  */
380
- createComputePipeline( pipeline, bindings ) {
380
+ createComputePipeline( pipeline, bindings, promises = null ) {
381
381
 
382
382
  const backend = this.backend;
383
383
  const device = backend.device;
@@ -414,23 +414,87 @@ class WebGPUPipelineUtils {
414
414
  _computePipelineDescriptor.compute = computeProgram;
415
415
  _computePipelineDescriptor.layout = pipelineLayout;
416
416
 
417
- pipelineGPU.pipeline = device.createComputePipeline( _computePipelineDescriptor );
417
+ if ( promises === null ) {
418
+
419
+ pipelineGPU.pipeline = device.createComputePipeline( _computePipelineDescriptor );
420
+
421
+ _computePipelineDescriptor.reset();
418
422
 
419
- _computePipelineDescriptor.reset();
423
+ device.popErrorScope().then( ( err ) => {
420
424
 
421
- device.popErrorScope().then( ( err ) => {
425
+ if ( err !== null ) {
422
426
 
423
- if ( err !== null ) {
427
+ pipelineGPU.error = true;
424
428
 
425
- pipelineGPU.error = true;
429
+ error( `WebGPURenderer: Compute pipeline creation failed (${ pipelineLabel }): ${ err.message }` );
426
430
 
427
- error( `WebGPURenderer: Compute pipeline creation failed (${ pipelineLabel }): ${ err.message }` );
431
+ this._reportShaderDiagnostics( [ { program: computeStage, module: computeProgram.module } ], pipelineLabel );
428
432
 
429
- this._reportShaderDiagnostics( [ { program: computeStage, module: computeProgram.module } ], pipelineLabel );
433
+ }
430
434
 
431
- }
435
+ } );
436
+
437
+ } else {
438
+
439
+ const promise = new Promise( async ( resolve /*, reject*/ ) => {
440
+
441
+ try {
442
+
443
+ let asyncError = null;
444
+ let pipelinePromise = null;
445
+
446
+ try {
447
+
448
+ pipelinePromise = device.createComputePipelineAsync( _computePipelineDescriptor );
449
+
450
+ } catch ( err ) {
451
+
452
+ asyncError = err;
453
+
454
+ }
455
+
456
+ _computePipelineDescriptor.reset();
457
+
458
+ if ( pipelinePromise !== null ) {
459
+
460
+ try {
432
461
 
433
- } );
462
+ pipelineGPU.pipeline = await pipelinePromise;
463
+
464
+ } catch ( err ) {
465
+
466
+ asyncError = err;
467
+
468
+ }
469
+
470
+ }
471
+
472
+ const errorScope = await device.popErrorScope();
473
+
474
+ if ( errorScope !== null || asyncError !== null ) {
475
+
476
+ pipelineGPU.error = true;
477
+
478
+ const reason = ( errorScope && errorScope.message ) || ( asyncError && asyncError.message ) || 'unknown';
479
+ error( `WebGPURenderer: Async compute pipeline creation failed (${ pipelineLabel }): ${ reason }` );
480
+
481
+ await this._reportShaderDiagnostics( [ { program: computeStage, module: computeProgram.module } ], pipelineLabel );
482
+
483
+ }
484
+
485
+ } finally {
486
+
487
+ // Guarantee resolution so `compileComputeAsync`'s Promise.all cannot hang on an
488
+ // unexpected throw from any await above.
489
+ resolve();
490
+
491
+ }
492
+
493
+ } );
494
+
495
+ promises.push( promise );
496
+
497
+ }
434
498
 
435
499
  }
436
500
 
@@ -649,11 +713,13 @@ class WebGPUPipelineUtils {
649
713
  blendFactor = GPUBlendFactor.SrcAlphaSaturated;
650
714
  break;
651
715
 
652
- case BlendColorFactor:
716
+ case ConstantColorFactor:
717
+ case ConstantAlphaFactor: // WebGPU has no dedicated constant alpha blend factors
653
718
  blendFactor = GPUBlendFactor.Constant;
654
719
  break;
655
720
 
656
- case OneMinusBlendColorFactor:
721
+ case OneMinusConstantColorFactor:
722
+ case OneMinusConstantAlphaFactor: // WebGPU has no dedicated constant alpha blend factors
657
723
  blendFactor = GPUBlendFactor.OneMinusConstant;
658
724
  break;
659
725