super-three 0.165.0 → 0.167.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 (370) hide show
  1. package/build/three.cjs +706 -383
  2. package/build/three.module.js +702 -384
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +76086 -0
  5. package/build/three.webgpu.min.js +6 -0
  6. package/examples/jsm/Addons.js +2 -1
  7. package/examples/jsm/csm/CSMShader.js +4 -4
  8. package/examples/jsm/exporters/GLTFExporter.js +7 -3
  9. package/examples/jsm/geometries/TeapotGeometry.js +1 -1
  10. package/examples/jsm/helpers/ViewHelper.js +51 -2
  11. package/examples/jsm/libs/tween.module.js +64 -75
  12. package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
  13. package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
  14. package/examples/jsm/lines/webgpu/Line2.js +20 -0
  15. package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
  16. package/examples/jsm/loaders/FBXLoader.js +23 -45
  17. package/examples/jsm/loaders/GLTFLoader.js +10 -4
  18. package/examples/jsm/loaders/MaterialXLoader.js +2 -9
  19. package/examples/jsm/loaders/USDZLoader.js +124 -76
  20. package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
  21. package/examples/jsm/loaders/VTKLoader.js +76 -3
  22. package/examples/jsm/misc/GPUComputationRenderer.js +9 -19
  23. package/examples/jsm/modifiers/SimplifyModifier.js +2 -1
  24. package/examples/jsm/objects/InstancedPoints.js +2 -2
  25. package/examples/jsm/postprocessing/RenderTransitionPass.js +13 -38
  26. package/examples/jsm/postprocessing/SSAOPass.js +6 -9
  27. package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
  28. package/examples/jsm/shaders/ColorifyShader.js +1 -2
  29. package/examples/jsm/shaders/FXAAShader.js +0 -2
  30. package/examples/jsm/shaders/GTAOShader.js +1 -1
  31. package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
  32. package/examples/jsm/transpiler/GLSLDecoder.js +46 -4
  33. package/examples/jsm/transpiler/TSLEncoder.js +17 -15
  34. package/package.json +7 -6
  35. package/src/Three.WebGPU.js +194 -0
  36. package/src/Three.js +2 -0
  37. package/src/constants.js +4 -1
  38. package/src/core/Object3D.js +22 -22
  39. package/src/extras/TextureUtils.js +210 -0
  40. package/src/lights/Light.js +1 -0
  41. package/src/lights/LightShadow.js +5 -0
  42. package/{examples/jsm/lights → src/lights/webgpu}/IESSpotLight.js +1 -1
  43. package/src/loaders/ObjectLoader.js +33 -2
  44. package/src/materials/Material.js +13 -4
  45. package/src/math/Box2.js +4 -4
  46. package/src/math/Box3.js +6 -6
  47. package/src/math/ColorManagement.js +10 -0
  48. package/src/math/Matrix2.js +54 -0
  49. package/src/math/Vector4.js +13 -0
  50. package/{examples/jsm → src}/nodes/Nodes.js +30 -12
  51. package/{examples/jsm → src}/nodes/accessors/BatchNode.js +28 -10
  52. package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +36 -1
  53. package/src/nodes/accessors/CameraNode.js +19 -0
  54. package/{examples/jsm → src}/nodes/accessors/CubeTextureNode.js +22 -5
  55. package/src/nodes/accessors/InstanceNode.js +140 -0
  56. package/{examples/jsm → src}/nodes/accessors/MaterialNode.js +22 -2
  57. package/{examples/jsm → src}/nodes/accessors/ModelNode.js +2 -1
  58. package/{examples/jsm → src}/nodes/accessors/MorphNode.js +24 -20
  59. package/{examples/jsm → src}/nodes/accessors/NormalNode.js +1 -1
  60. package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +1 -1
  61. package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +1 -1
  62. package/{examples/jsm → src}/nodes/accessors/ReflectVectorNode.js +4 -0
  63. package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +50 -1
  64. package/{examples/jsm → src}/nodes/accessors/StorageTextureNode.js +12 -3
  65. package/{examples/jsm → src}/nodes/accessors/TextureNode.js +55 -18
  66. package/{examples/jsm → src}/nodes/accessors/UniformsNode.js +7 -1
  67. package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +2 -1
  68. package/{examples/jsm → src}/nodes/code/ScriptableNode.js +14 -0
  69. package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +2 -1
  70. package/{examples/jsm → src}/nodes/core/AttributeNode.js +20 -6
  71. package/{examples/jsm → src}/nodes/core/CacheNode.js +7 -10
  72. package/{examples/jsm → src}/nodes/core/IndexNode.js +6 -0
  73. package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
  74. package/src/nodes/core/MRTNode.js +76 -0
  75. package/{examples/jsm → src}/nodes/core/Node.js +18 -12
  76. package/{examples/jsm → src}/nodes/core/NodeBuilder.js +175 -37
  77. package/src/nodes/core/NodeCache.js +36 -0
  78. package/{examples/jsm → src}/nodes/core/NodeFrame.js +42 -0
  79. package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
  80. package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
  81. package/{examples/jsm → src}/nodes/core/NodeUtils.js +6 -1
  82. package/{examples/jsm → src}/nodes/core/PropertyNode.js +1 -0
  83. package/{examples/jsm → src}/nodes/core/TempNode.js +2 -2
  84. package/{examples/jsm → src}/nodes/core/UniformGroupNode.js +20 -0
  85. package/{examples/jsm → src}/nodes/core/UniformNode.js +10 -1
  86. package/{examples/jsm → src}/nodes/core/VarNode.js +2 -6
  87. package/{examples/jsm → src}/nodes/core/VaryingNode.js +8 -0
  88. package/{examples/jsm → src}/nodes/display/AfterImageNode.js +19 -27
  89. package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +18 -21
  90. package/src/nodes/display/BloomNode.js +333 -0
  91. package/{examples/jsm → src}/nodes/display/ColorAdjustmentNode.js +7 -2
  92. package/{examples/jsm → src}/nodes/display/ColorSpaceNode.js +1 -1
  93. package/src/nodes/display/DenoiseNode.js +198 -0
  94. package/src/nodes/display/DepthOfFieldNode.js +119 -0
  95. package/src/nodes/display/DotScreenNode.js +75 -0
  96. package/src/nodes/display/FXAANode.js +327 -0
  97. package/src/nodes/display/FilmNode.js +52 -0
  98. package/{examples/jsm → src}/nodes/display/FrontFacingNode.js +2 -1
  99. package/src/nodes/display/GTAONode.js +324 -0
  100. package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +34 -17
  101. package/src/nodes/display/Lut3DNode.js +53 -0
  102. package/{examples/jsm → src}/nodes/display/NormalMapNode.js +1 -1
  103. package/src/nodes/display/PassNode.js +291 -0
  104. package/src/nodes/display/PixelationPassNode.js +201 -0
  105. package/src/nodes/display/RGBShiftNode.js +49 -0
  106. package/src/nodes/display/RenderOutputNode.js +56 -0
  107. package/src/nodes/display/SobelOperatorNode.js +121 -0
  108. package/{examples/jsm → src}/nodes/display/ToneMappingNode.js +44 -5
  109. package/src/nodes/display/TransitionNode.js +76 -0
  110. package/{examples/jsm → src}/nodes/display/ViewportDepthNode.js +39 -16
  111. package/{examples/jsm → src}/nodes/display/ViewportDepthTextureNode.js +2 -1
  112. package/{examples/jsm → src}/nodes/display/ViewportNode.js +2 -1
  113. package/{examples/jsm → src}/nodes/display/ViewportSharedTextureNode.js +2 -1
  114. package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +5 -2
  115. package/src/nodes/functions/BSDF/LTC.js +131 -0
  116. package/src/nodes/functions/BasicLightingModel.js +78 -0
  117. package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +5 -3
  118. package/{examples/jsm → src}/nodes/functions/PhysicalLightingModel.js +42 -1
  119. package/{examples/jsm → src}/nodes/functions/ToonLightingModel.js +3 -1
  120. package/{examples/jsm → src}/nodes/geometry/RangeNode.js +19 -6
  121. package/{examples/jsm → src}/nodes/lighting/AONode.js +1 -4
  122. package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +1 -1
  123. package/src/nodes/lighting/AnalyticLightNode.js +333 -0
  124. package/src/nodes/lighting/BasicEnvironmentNode.js +26 -0
  125. package/src/nodes/lighting/BasicLightMapNode.js +29 -0
  126. package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +2 -3
  127. package/{examples/jsm → src}/nodes/lighting/EnvironmentNode.js +5 -4
  128. package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +2 -1
  129. package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +1 -1
  130. package/{examples/jsm → src}/nodes/lighting/LightingNode.js +2 -0
  131. package/{examples/jsm → src}/nodes/lighting/LightsNode.js +1 -3
  132. package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +2 -3
  133. package/src/nodes/lighting/RectAreaLightNode.js +97 -0
  134. package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +2 -3
  135. package/{examples/jsm → src}/nodes/loaders/NodeLoader.js +3 -1
  136. package/{examples/jsm → src}/nodes/loaders/NodeMaterialLoader.js +2 -1
  137. package/{examples/jsm → src}/nodes/loaders/NodeObjectLoader.js +2 -1
  138. package/{examples/jsm → src}/nodes/materials/InstancedPointsNodeMaterial.js +3 -3
  139. package/{examples/jsm → src}/nodes/materials/Line2NodeMaterial.js +3 -3
  140. package/{examples/jsm → src}/nodes/materials/LineBasicNodeMaterial.js +3 -3
  141. package/{examples/jsm → src}/nodes/materials/LineDashedNodeMaterial.js +4 -3
  142. package/src/nodes/materials/MeshBasicNodeMaterial.js +73 -0
  143. package/{examples/jsm → src}/nodes/materials/MeshLambertNodeMaterial.js +12 -3
  144. package/{examples/jsm → src}/nodes/materials/MeshMatcapNodeMaterial.js +6 -5
  145. package/{examples/jsm → src}/nodes/materials/MeshNormalNodeMaterial.js +5 -3
  146. package/{examples/jsm → src}/nodes/materials/MeshPhongNodeMaterial.js +11 -3
  147. package/{examples/jsm → src}/nodes/materials/MeshPhysicalNodeMaterial.js +5 -4
  148. package/{examples/jsm → src}/nodes/materials/MeshStandardNodeMaterial.js +14 -3
  149. package/{examples/jsm → src}/nodes/materials/MeshToonNodeMaterial.js +3 -3
  150. package/{examples/jsm → src}/nodes/materials/NodeMaterial.js +85 -20
  151. package/{examples/jsm → src}/nodes/materials/PointsNodeMaterial.js +3 -3
  152. package/{examples/jsm → src}/nodes/materials/ShadowNodeMaterial.js +3 -3
  153. package/{examples/jsm → src}/nodes/materials/SpriteNodeMaterial.js +3 -3
  154. package/{examples/jsm → src}/nodes/materialx/lib/mx_hsv.js +9 -17
  155. package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +474 -577
  156. package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +2 -8
  157. package/{examples/jsm → src}/nodes/math/CondNode.js +13 -6
  158. package/{examples/jsm → src}/nodes/math/MathNode.js +14 -1
  159. package/{examples/jsm → src}/nodes/math/OperatorNode.js +6 -6
  160. package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
  161. package/{examples/jsm → src}/nodes/pmrem/PMREMNode.js +2 -1
  162. package/{examples/jsm → src}/nodes/shadernode/ShaderNode.js +2 -0
  163. package/{examples/jsm → src}/nodes/utils/DiscardNode.js +1 -0
  164. package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +2 -0
  165. package/{examples/jsm → src}/nodes/utils/LoopNode.js +7 -6
  166. package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +8 -2
  167. package/src/nodes/utils/RTTNode.js +130 -0
  168. package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +9 -1
  169. package/src/objects/BatchedMesh.js +168 -188
  170. package/src/objects/InstancedMesh.js +1 -1
  171. package/src/renderers/WebGLRenderer.js +38 -25
  172. package/{examples/jsm → src}/renderers/common/Attributes.js +2 -1
  173. package/{examples/jsm → src}/renderers/common/Backend.js +30 -27
  174. package/{examples/jsm → src}/renderers/common/Background.js +9 -3
  175. package/src/renderers/common/BindGroup.js +16 -0
  176. package/{examples/jsm → src}/renderers/common/Bindings.js +38 -23
  177. package/{examples/jsm → src}/renderers/common/ClippingContext.js +4 -2
  178. package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
  179. package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +7 -1
  180. package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
  181. package/{examples/jsm → src}/renderers/common/Info.js +34 -6
  182. package/src/renderers/common/PostProcessing.js +87 -0
  183. package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +6 -3
  184. package/{examples/jsm → src}/renderers/common/RenderContext.js +1 -1
  185. package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
  186. package/{examples/jsm → src}/renderers/common/RenderObject.js +44 -11
  187. package/{examples/jsm → src}/renderers/common/Renderer.js +84 -32
  188. package/{examples/jsm → src}/renderers/common/SampledTexture.js +2 -2
  189. package/{examples/jsm → src}/renderers/common/StorageBufferAttribute.js +1 -1
  190. package/{examples/jsm → src}/renderers/common/StorageInstancedBufferAttribute.js +1 -1
  191. package/{examples/jsm → src}/renderers/common/StorageTexture.js +2 -1
  192. package/{examples/jsm → src}/renderers/common/Textures.js +6 -2
  193. package/{examples/jsm → src}/renderers/common/Uniform.js +9 -4
  194. package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
  195. package/{examples/jsm → src}/renderers/common/extras/PMREMGenerator.js +13 -12
  196. package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
  197. package/{examples/jsm → src}/renderers/common/nodes/NodeSampledTexture.js +6 -5
  198. package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +2 -1
  199. package/{examples/jsm → src}/renderers/common/nodes/NodeStorageBuffer.js +5 -1
  200. package/{examples/jsm → src}/renderers/common/nodes/NodeUniform.js +3 -3
  201. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformBuffer.js +2 -1
  202. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformsGroup.js +2 -8
  203. package/{examples/jsm → src}/renderers/common/nodes/Nodes.js +37 -16
  204. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +16 -1
  205. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
  206. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +1 -1
  207. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +0 -9
  208. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -10
  209. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
  210. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +45 -13
  211. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -4
  212. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +3 -0
  213. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +3 -3
  214. package/src/renderers/shaders/ShaderLib/depth.glsl.js +8 -0
  215. package/src/renderers/shaders/UniformsLib.js +3 -0
  216. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  217. package/src/renderers/webgl/WebGLBufferRenderer.js +6 -19
  218. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +6 -18
  219. package/src/renderers/webgl/WebGLLights.js +6 -0
  220. package/src/renderers/webgl/WebGLProgram.js +26 -0
  221. package/src/renderers/webgl/WebGLPrograms.js +1 -1
  222. package/src/renderers/webgl/WebGLTextures.js +14 -53
  223. package/src/renderers/webgl/WebGLUniforms.js +12 -2
  224. package/src/renderers/webgl/WebGLUniformsGroups.js +7 -7
  225. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +156 -54
  226. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +178 -43
  227. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +2 -2
  228. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +1 -0
  229. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLExtensions.js +2 -0
  230. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLState.js +1 -1
  231. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +34 -2
  232. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
  233. package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +164 -76
  234. package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +2 -2
  235. package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +194 -56
  236. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
  237. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  238. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +20 -13
  239. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +3 -1
  240. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +28 -21
  241. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +40 -23
  242. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +24 -3
  243. package/src/renderers/webxr/WebXRDepthSensing.js +6 -0
  244. package/src/renderers/webxr/WebXRManager.js +6 -0
  245. package/src/textures/CompressedArrayTexture.js +1 -1
  246. package/examples/jsm/nodes/accessors/CameraNode.js +0 -12
  247. package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
  248. package/examples/jsm/nodes/core/NodeCache.js +0 -26
  249. package/examples/jsm/nodes/display/PassNode.js +0 -201
  250. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -256
  251. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
  252. package/examples/jsm/renderers/common/PostProcessing.js +0 -33
  253. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
  254. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
  255. /package/{examples/jsm → src}/nodes/accessors/AccessorsUtils.js +0 -0
  256. /package/{examples/jsm → src}/nodes/accessors/BitangentNode.js +0 -0
  257. /package/{examples/jsm → src}/nodes/accessors/BufferNode.js +0 -0
  258. /package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +0 -0
  259. /package/{examples/jsm → src}/nodes/accessors/InstancedPointsMaterialNode.js +0 -0
  260. /package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +0 -0
  261. /package/{examples/jsm → src}/nodes/accessors/ModelViewProjectionNode.js +0 -0
  262. /package/{examples/jsm → src}/nodes/accessors/PointUVNode.js +0 -0
  263. /package/{examples/jsm → src}/nodes/accessors/PositionNode.js +0 -0
  264. /package/{examples/jsm → src}/nodes/accessors/RendererReferenceNode.js +0 -0
  265. /package/{examples/jsm → src}/nodes/accessors/SceneNode.js +0 -0
  266. /package/{examples/jsm → src}/nodes/accessors/SkinningNode.js +0 -0
  267. /package/{examples/jsm → src}/nodes/accessors/TangentNode.js +0 -0
  268. /package/{examples/jsm → src}/nodes/accessors/Texture3DNode.js +0 -0
  269. /package/{examples/jsm → src}/nodes/accessors/TextureBicubicNode.js +0 -0
  270. /package/{examples/jsm → src}/nodes/accessors/TextureSizeNode.js +0 -0
  271. /package/{examples/jsm → src}/nodes/accessors/UVNode.js +0 -0
  272. /package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +0 -0
  273. /package/{examples/jsm → src}/nodes/code/CodeNode.js +0 -0
  274. /package/{examples/jsm → src}/nodes/code/ExpressionNode.js +0 -0
  275. /package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +0 -0
  276. /package/{examples/jsm → src}/nodes/code/FunctionNode.js +0 -0
  277. /package/{examples/jsm → src}/nodes/core/AssignNode.js +0 -0
  278. /package/{examples/jsm → src}/nodes/core/BypassNode.js +0 -0
  279. /package/{examples/jsm → src}/nodes/core/ConstNode.js +0 -0
  280. /package/{examples/jsm → src}/nodes/core/ContextNode.js +0 -0
  281. /package/{examples/jsm → src}/nodes/core/InputNode.js +0 -0
  282. /package/{examples/jsm → src}/nodes/core/NodeAttribute.js +0 -0
  283. /package/{examples/jsm → src}/nodes/core/NodeCode.js +0 -0
  284. /package/{examples/jsm → src}/nodes/core/NodeFunctionInput.js +0 -0
  285. /package/{examples/jsm → src}/nodes/core/NodeKeywords.js +0 -0
  286. /package/{examples/jsm → src}/nodes/core/NodeParser.js +0 -0
  287. /package/{examples/jsm → src}/nodes/core/NodeVar.js +0 -0
  288. /package/{examples/jsm → src}/nodes/core/NodeVarying.js +0 -0
  289. /package/{examples/jsm → src}/nodes/core/OutputStructNode.js +0 -0
  290. /package/{examples/jsm → src}/nodes/core/ParameterNode.js +0 -0
  291. /package/{examples/jsm → src}/nodes/core/StackNode.js +0 -0
  292. /package/{examples/jsm → src}/nodes/core/StructTypeNode.js +0 -0
  293. /package/{examples/jsm → src}/nodes/core/UniformGroup.js +0 -0
  294. /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
  295. /package/{examples/jsm → src}/nodes/display/BlendModeNode.js +0 -0
  296. /package/{examples/jsm → src}/nodes/display/BumpMapNode.js +0 -0
  297. /package/{examples/jsm → src}/nodes/display/PosterizeNode.js +0 -0
  298. /package/{examples/jsm → src}/nodes/fog/FogExp2Node.js +0 -0
  299. /package/{examples/jsm → src}/nodes/fog/FogNode.js +0 -0
  300. /package/{examples/jsm → src}/nodes/fog/FogRangeNode.js +0 -0
  301. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_GGX.js +0 -0
  302. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +0 -0
  303. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +0 -0
  304. /package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +0 -0
  305. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +0 -0
  306. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX_Anisotropic.js +0 -0
  307. /package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +0 -0
  308. /package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +0 -0
  309. /package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +0 -0
  310. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +0 -0
  311. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +0 -0
  312. /package/{examples/jsm → src}/nodes/functions/ShadowMaskModel.js +0 -0
  313. /package/{examples/jsm → src}/nodes/functions/material/getGeometryRoughness.js +0 -0
  314. /package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +0 -0
  315. /package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +0 -0
  316. /package/{examples/jsm → src}/nodes/lighting/IrradianceNode.js +0 -0
  317. /package/{examples/jsm → src}/nodes/lighting/LightNode.js +0 -0
  318. /package/{examples/jsm → src}/nodes/lighting/LightUtils.js +0 -0
  319. /package/{examples/jsm → src}/nodes/lighting/LightingContextNode.js +0 -0
  320. /package/{examples/jsm → src}/nodes/materials/Materials.js +0 -0
  321. /package/{examples/jsm → src}/nodes/materials/MeshSSSNodeMaterial.js +0 -0
  322. /package/{examples/jsm → src}/nodes/materials/VolumeNodeMaterial.js +0 -0
  323. /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
  324. /package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +0 -0
  325. /package/{examples/jsm → src}/nodes/math/HashNode.js +0 -0
  326. /package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -0
  327. /package/{examples/jsm → src}/nodes/math/TriNoise3D.js +0 -0
  328. /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
  329. /package/{examples/jsm → src}/nodes/pmrem/PMREMUtils.js +0 -0
  330. /package/{examples/jsm → src}/nodes/procedural/CheckerNode.js +0 -0
  331. /package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +0 -0
  332. /package/{examples/jsm → src}/nodes/utils/ConvertNode.js +0 -0
  333. /package/{examples/jsm → src}/nodes/utils/EquirectUVNode.js +0 -0
  334. /package/{examples/jsm → src}/nodes/utils/JoinNode.js +0 -0
  335. /package/{examples/jsm → src}/nodes/utils/MatcapUVNode.js +0 -0
  336. /package/{examples/jsm → src}/nodes/utils/OscNode.js +0 -0
  337. /package/{examples/jsm → src}/nodes/utils/PackingNode.js +0 -0
  338. /package/{examples/jsm → src}/nodes/utils/RemapNode.js +0 -0
  339. /package/{examples/jsm → src}/nodes/utils/RotateNode.js +0 -0
  340. /package/{examples/jsm → src}/nodes/utils/RotateUVNode.js +0 -0
  341. /package/{examples/jsm → src}/nodes/utils/SetNode.js +0 -0
  342. /package/{examples/jsm → src}/nodes/utils/SplitNode.js +0 -0
  343. /package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +0 -0
  344. /package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +0 -0
  345. /package/{examples/jsm → src}/nodes/utils/TimerNode.js +0 -0
  346. /package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +0 -0
  347. /package/{examples/jsm → src}/renderers/common/Animation.js +0 -0
  348. /package/{examples/jsm → src}/renderers/common/Binding.js +0 -0
  349. /package/{examples/jsm → src}/renderers/common/Buffer.js +0 -0
  350. /package/{examples/jsm → src}/renderers/common/BufferUtils.js +0 -0
  351. /package/{examples/jsm → src}/renderers/common/ChainMap.js +0 -0
  352. /package/{examples/jsm → src}/renderers/common/ComputePipeline.js +0 -0
  353. /package/{examples/jsm → src}/renderers/common/Constants.js +0 -0
  354. /package/{examples/jsm → src}/renderers/common/DataMap.js +0 -0
  355. /package/{examples/jsm → src}/renderers/common/Pipeline.js +0 -0
  356. /package/{examples/jsm → src}/renderers/common/Pipelines.js +0 -0
  357. /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
  358. /package/{examples/jsm → src}/renderers/common/RenderBundle.js +0 -0
  359. /package/{examples/jsm → src}/renderers/common/RenderBundles.js +0 -0
  360. /package/{examples/jsm → src}/renderers/common/RenderList.js +0 -0
  361. /package/{examples/jsm → src}/renderers/common/RenderLists.js +0 -0
  362. /package/{examples/jsm → src}/renderers/common/RenderObjects.js +0 -0
  363. /package/{examples/jsm → src}/renderers/common/RenderPipeline.js +0 -0
  364. /package/{examples/jsm → src}/renderers/common/Sampler.js +0 -0
  365. /package/{examples/jsm → src}/renderers/common/StorageBuffer.js +0 -0
  366. /package/{examples/jsm → src}/renderers/common/UniformBuffer.js +0 -0
  367. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBufferRenderer.js +0 -0
  368. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLCapabilities.js +0 -0
  369. /package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeParser.js +0 -0
  370. /package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +0 -0
@@ -1,5 +1,3 @@
1
- import { NoColorSpace, FloatType } from 'three';
2
-
3
1
  import NodeUniformsGroup from '../../common/nodes/NodeUniformsGroup.js';
4
2
 
5
3
  import NodeSampler from '../../common/nodes/NodeSampler.js';
@@ -13,8 +11,9 @@ import { NodeBuilder, CodeNode } from '../../../nodes/Nodes.js';
13
11
  import { getFormat } from '../utils/WebGPUTextureUtils.js';
14
12
 
15
13
  import WGSLNodeParser from './WGSLNodeParser.js';
16
- import { GPUStorageTextureAccess } from '../utils/WebGPUConstants.js';
14
+ import { GPUBufferBindingType, GPUStorageTextureAccess } from '../utils/WebGPUConstants.js';
17
15
 
16
+ import { NoColorSpace, FloatType } from '../../../constants.js';
18
17
 
19
18
  // GPUShaderStage is not defined in browsers not supporting WebGPU
20
19
  const GPUShaderStage = self.GPUShaderStage;
@@ -27,6 +26,7 @@ const gpuShaderStageLib = {
27
26
 
28
27
  const supports = {
29
28
  instance: true,
29
+ swizzleAssign: false,
30
30
  storageBuffer: true
31
31
  };
32
32
 
@@ -126,20 +126,45 @@ fn threejs_repeatWrapping( uv : vec2<f32>, dimension : vec2<u32> ) -> vec2<u32>
126
126
 
127
127
  return ( ( uvScaled % dimension ) + dimension ) % dimension;
128
128
 
129
+ }
130
+ ` ),
131
+ biquadraticTexture: new CodeNode( `
132
+ fn threejs_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, level : i32 ) -> vec4f {
133
+
134
+ let res = vec2f( textureDimensions( map, level ) );
135
+
136
+ let uvScaled = coord * res;
137
+ let uvWrapping = ( ( uvScaled % res ) + res ) % res;
138
+
139
+ // https://www.shadertoy.com/view/WtyXRy
140
+
141
+ let uv = uvWrapping - 0.5;
142
+ let iuv = floor( uv );
143
+ let f = fract( uv );
144
+
145
+ let rg1 = textureLoad( map, vec2i( iuv + vec2( 0.5, 0.5 ) ), level );
146
+ let rg2 = textureLoad( map, vec2i( iuv + vec2( 1.5, 0.5 ) ), level );
147
+ let rg3 = textureLoad( map, vec2i( iuv + vec2( 0.5, 1.5 ) ), level );
148
+ let rg4 = textureLoad( map, vec2i( iuv + vec2( 1.5, 1.5 ) ), level );
149
+
150
+ return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
151
+
129
152
  }
130
153
  ` )
131
154
  };
132
155
 
133
156
  class WGSLNodeBuilder extends NodeBuilder {
134
157
 
135
- constructor( object, renderer, scene = null ) {
158
+ constructor( object, renderer ) {
136
159
 
137
- super( object, renderer, new WGSLNodeParser(), scene );
160
+ super( object, renderer, new WGSLNodeParser() );
138
161
 
139
162
  this.uniformGroups = {};
140
163
 
141
164
  this.builtins = {};
142
165
 
166
+ this.directives = {};
167
+
143
168
  }
144
169
 
145
170
  needsColorSpaceToLinear( texture ) {
@@ -162,9 +187,13 @@ class WGSLNodeBuilder extends NodeBuilder {
162
187
 
163
188
  }
164
189
 
190
+ } else if ( this.isFilteredTexture( texture ) ) {
191
+
192
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet );
193
+
165
194
  } else {
166
195
 
167
- return this.generateTextureLod( texture, textureProperty, uvSnippet );
196
+ return this.generateTextureLod( texture, textureProperty, uvSnippet, '0' );
168
197
 
169
198
  }
170
199
 
@@ -190,6 +219,10 @@ class WGSLNodeBuilder extends NodeBuilder {
190
219
 
191
220
  return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
192
221
 
222
+ } else if ( this.isFilteredTexture( texture ) ) {
223
+
224
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet );
225
+
193
226
  } else {
194
227
 
195
228
  return this.generateTextureLod( texture, textureProperty, uvSnippet, levelSnippet );
@@ -198,11 +231,19 @@ class WGSLNodeBuilder extends NodeBuilder {
198
231
 
199
232
  }
200
233
 
234
+ generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet = '0' ) {
235
+
236
+ this._include( 'biquadraticTexture' );
237
+
238
+ return `threejs_biquadraticTexture( ${ textureProperty }, ${ uvSnippet }, i32( ${ levelSnippet } ) )`;
239
+
240
+ }
241
+
201
242
  generateTextureLod( texture, textureProperty, uvSnippet, levelSnippet = '0' ) {
202
243
 
203
244
  this._include( 'repeatWrapping' );
204
245
 
205
- const dimension = `textureDimensions( ${ textureProperty }, 0 )`;
246
+ const dimension = texture.isMultisampleRenderTargetTexture === true ? `textureDimensions( ${ textureProperty } )` : `textureDimensions( ${ textureProperty }, 0 )`;
206
247
 
207
248
  return `textureLoad( ${ textureProperty }, threejs_repeatWrapping( ${ uvSnippet }, ${ dimension } ), i32( ${ levelSnippet } ) )`;
208
249
 
@@ -230,7 +271,7 @@ class WGSLNodeBuilder extends NodeBuilder {
230
271
 
231
272
  isUnfilterable( texture ) {
232
273
 
233
- return this.getComponentTypeFromTexture( texture ) !== 'float' || ( texture.isDataTexture === true && texture.type === FloatType );
274
+ return this.getComponentTypeFromTexture( texture ) !== 'float' || ( texture.isDataTexture === true && texture.type === FloatType ) || texture.isMultisampleRenderTargetTexture === true;
234
275
 
235
276
  }
236
277
 
@@ -303,6 +344,20 @@ class WGSLNodeBuilder extends NodeBuilder {
303
344
 
304
345
  }
305
346
 
347
+ generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, shaderStage = this.shaderStage ) {
348
+
349
+ if ( shaderStage === 'fragment' ) {
350
+
351
+ return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet } )`;
352
+
353
+ } else {
354
+
355
+ console.error( `WebGPURenderer: THREE.TextureNode.biasNode does not support ${ shaderStage } shader.` );
356
+
357
+ }
358
+
359
+ }
360
+
306
361
  getPropertyName( node, shaderStage = this.shaderStage ) {
307
362
 
308
363
  if ( node.isNodeVarying === true && node.needsInterpolation === true ) {
@@ -372,30 +427,38 @@ class WGSLNodeBuilder extends NodeBuilder {
372
427
 
373
428
  switch ( node.access ) {
374
429
 
375
- case GPUStorageTextureAccess.ReadOnly: {
430
+ case GPUStorageTextureAccess.ReadOnly:
376
431
 
377
432
  return 'read';
378
433
 
379
- }
380
-
381
- case GPUStorageTextureAccess.WriteOnly: {
434
+ case GPUStorageTextureAccess.WriteOnly:
382
435
 
383
436
  return 'write';
384
437
 
385
- }
386
-
387
- default: {
438
+ default:
388
439
 
389
440
  return 'read_write';
390
441
 
391
- }
392
-
393
442
  }
394
443
 
395
444
  } else {
396
445
 
397
- // @TODO: Account for future read-only storage buffer pull request
398
- return 'read_write';
446
+ switch ( node.access ) {
447
+
448
+ case GPUBufferBindingType.Storage:
449
+
450
+ return 'read_write';
451
+
452
+
453
+ case GPUBufferBindingType.ReadOnlyStorage:
454
+
455
+ return 'read';
456
+
457
+ default:
458
+
459
+ return 'write';
460
+
461
+ }
399
462
 
400
463
  }
401
464
 
@@ -410,7 +473,10 @@ class WGSLNodeBuilder extends NodeBuilder {
410
473
 
411
474
  let uniformGPU;
412
475
 
413
- const bindings = this.bindings[ shaderStage ];
476
+ const group = node.groupNode;
477
+ const groupName = group.name;
478
+
479
+ const bindings = this.getBindGroupArray( groupName, shaderStage );
414
480
 
415
481
  if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
416
482
 
@@ -418,15 +484,15 @@ class WGSLNodeBuilder extends NodeBuilder {
418
484
 
419
485
  if ( type === 'texture' || type === 'storageTexture' ) {
420
486
 
421
- texture = new NodeSampledTexture( uniformNode.name, uniformNode.node, node.access ? node.access : null );
487
+ texture = new NodeSampledTexture( uniformNode.name, uniformNode.node, group, node.access ? node.access : null );
422
488
 
423
489
  } else if ( type === 'cubeTexture' ) {
424
490
 
425
- texture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, node.access ? node.access : null );
491
+ texture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group, node.access ? node.access : null );
426
492
 
427
493
  } else if ( type === 'texture3D' ) {
428
494
 
429
- texture = new NodeSampledTexture3D( uniformNode.name, uniformNode.node, node.access ? node.access : null );
495
+ texture = new NodeSampledTexture3D( uniformNode.name, uniformNode.node, group, node.access ? node.access : null );
430
496
 
431
497
  }
432
498
 
@@ -435,7 +501,7 @@ class WGSLNodeBuilder extends NodeBuilder {
435
501
 
436
502
  if ( shaderStage === 'fragment' && this.isUnfilterable( node.value ) === false && texture.store === false ) {
437
503
 
438
- const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node );
504
+ const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node, group );
439
505
  sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
440
506
 
441
507
  bindings.push( sampler, texture );
@@ -453,7 +519,7 @@ class WGSLNodeBuilder extends NodeBuilder {
453
519
  } else if ( type === 'buffer' || type === 'storageBuffer' ) {
454
520
 
455
521
  const bufferClass = type === 'storageBuffer' ? NodeStorageBuffer : NodeUniformBuffer;
456
- const buffer = new bufferClass( node );
522
+ const buffer = new bufferClass( node, group );
457
523
  buffer.setVisibility( gpuShaderStageLib[ shaderStage ] );
458
524
 
459
525
  bindings.push( buffer );
@@ -462,9 +528,6 @@ class WGSLNodeBuilder extends NodeBuilder {
462
528
 
463
529
  } else {
464
530
 
465
- const group = node.groupNode;
466
- const groupName = group.name;
467
-
468
531
  const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
469
532
 
470
533
  let uniformsGroup = uniformsStage[ groupName ];
@@ -488,24 +551,12 @@ class WGSLNodeBuilder extends NodeBuilder {
488
551
 
489
552
  nodeData.uniformGPU = uniformGPU;
490
553
 
491
- if ( shaderStage === 'vertex' ) {
492
-
493
- this.bindingsOffset[ 'fragment' ] = bindings.length;
494
-
495
- }
496
-
497
554
  }
498
555
 
499
556
  return uniformNode;
500
557
 
501
558
  }
502
559
 
503
- isReference( type ) {
504
-
505
- return super.isReference( type ) || type === 'texture_2d' || type === 'texture_cube' || type === 'texture_depth_2d' || type === 'texture_storage_2d' || type === 'texture_3d';
506
-
507
- }
508
-
509
560
  getBuiltin( name, property, type, shaderStage = this.shaderStage ) {
510
561
 
511
562
  const map = this.builtins[ shaderStage ] || ( this.builtins[ shaderStage ] = new Map() );
@@ -576,6 +627,12 @@ ${ flowData.code }
576
627
 
577
628
  }
578
629
 
630
+ getDrawIndex() {
631
+
632
+ return null;
633
+
634
+ }
635
+
579
636
  getFrontFacing() {
580
637
 
581
638
  return this.getBuiltin( 'front_facing', 'isFront', 'bool' );
@@ -600,6 +657,50 @@ ${ flowData.code }
600
657
 
601
658
  }
602
659
 
660
+ enableDirective( name, shaderStage = this.shaderStage ) {
661
+
662
+ const stage = this.directives[ shaderStage ] || ( this.directives[ shaderStage ] = [] );
663
+ stage.push( name );
664
+
665
+ }
666
+
667
+ getDirectives( shaderStage ) {
668
+
669
+ const snippets = [];
670
+ const directives = this.directives[ shaderStage ];
671
+
672
+ if ( directives !== undefined ) {
673
+
674
+ for ( const directive of directives ) {
675
+
676
+ snippets.push( `enable ${directive}` );
677
+
678
+ }
679
+
680
+ }
681
+
682
+ return snippets.join( '\n' );
683
+
684
+ }
685
+
686
+ enableClipDistances() {
687
+
688
+ this.enableDirective( 'clip_distances' );
689
+
690
+ }
691
+
692
+ enableShaderF16() {
693
+
694
+ this.enableDirective( 'f16' );
695
+
696
+ }
697
+
698
+ enableDualSourceBlending() {
699
+
700
+ this.enableDirective( 'dual_source_blending' );
701
+
702
+ }
703
+
603
704
  getBuiltins( shaderStage ) {
604
705
 
605
706
  const snippets = [];
@@ -626,6 +727,9 @@ ${ flowData.code }
626
727
  if ( shaderStage === 'compute' ) {
627
728
 
628
729
  this.getBuiltin( 'global_invocation_id', 'id', 'vec3<u32>', 'attribute' );
730
+ this.getBuiltin( 'workgroup_id', 'workgroupId', 'vec3<u32>', 'attribute' );
731
+ this.getBuiltin( 'local_invocation_id', 'localId', 'vec3<u32>', 'attribute' );
732
+ this.getBuiltin( 'num_workgroups', 'numWorkgroups', 'vec3<u32>', 'attribute' );
629
733
 
630
734
  }
631
735
 
@@ -687,9 +791,10 @@ ${ flowData.code }
687
791
  snippet += this.getStructMembers( struct );
688
792
  snippet += '\n}';
689
793
 
794
+
690
795
  snippets.push( snippet );
691
796
 
692
- snippets.push( `\nvar<private> output : ${ name };\n\n`);
797
+ snippets.push( `\nvar<private> output : ${ name };\n\n` );
693
798
 
694
799
  }
695
800
 
@@ -783,10 +888,11 @@ ${ flowData.code }
783
888
  const structSnippets = [];
784
889
  const uniformGroups = {};
785
890
 
786
- let index = this.bindingsOffset[ shaderStage ];
787
-
788
891
  for ( const uniform of uniforms ) {
789
892
 
893
+ const groundName = uniform.groupNode.name;
894
+ const uniformIndexes = this.bindingsIndexes[ groundName ];
895
+
790
896
  if ( uniform.type === 'texture' || uniform.type === 'cubeTexture' || uniform.type === 'storageTexture' || uniform.type === 'texture3D' ) {
791
897
 
792
898
  const texture = uniform.node.value;
@@ -795,11 +901,11 @@ ${ flowData.code }
795
901
 
796
902
  if ( texture.isDepthTexture === true && texture.compareFunction !== null ) {
797
903
 
798
- bindingSnippets.push( `@binding( ${index ++} ) @group( 0 ) var ${uniform.name}_sampler : sampler_comparison;` );
904
+ bindingSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var ${ uniform.name }_sampler : sampler_comparison;` );
799
905
 
800
906
  } else {
801
907
 
802
- bindingSnippets.push( `@binding( ${index ++} ) @group( 0 ) var ${uniform.name}_sampler : sampler;` );
908
+ bindingSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var ${ uniform.name }_sampler : sampler;` );
803
909
 
804
910
  }
805
911
 
@@ -807,6 +913,14 @@ ${ flowData.code }
807
913
 
808
914
  let textureType;
809
915
 
916
+ let multisampled = '';
917
+
918
+ if ( texture.isMultisampleRenderTargetTexture === true ) {
919
+
920
+ multisampled = '_multisampled';
921
+
922
+ }
923
+
810
924
  if ( texture.isCubeTexture === true ) {
811
925
 
812
926
  textureType = 'texture_cube<f32>';
@@ -817,7 +931,7 @@ ${ flowData.code }
817
931
 
818
932
  } else if ( texture.isDepthTexture === true ) {
819
933
 
820
- textureType = 'texture_depth_2d';
934
+ textureType = `texture_depth${multisampled}_2d`;
821
935
 
822
936
  } else if ( texture.isVideoTexture === true ) {
823
937
 
@@ -832,17 +946,17 @@ ${ flowData.code }
832
946
  const format = getFormat( texture );
833
947
  const access = this.getStorageAccess( uniform.node );
834
948
 
835
- textureType = `texture_storage_2d<${ format }, ${access}>`;
949
+ textureType = `texture_storage_2d<${ format }, ${ access }>`;
836
950
 
837
951
  } else {
838
952
 
839
953
  const componentPrefix = this.getComponentTypeFromTexture( texture ).charAt( 0 );
840
954
 
841
- textureType = `texture_2d<${ componentPrefix }32>`;
955
+ textureType = `texture${multisampled}_2d<${ componentPrefix }32>`;
842
956
 
843
957
  }
844
958
 
845
- bindingSnippets.push( `@binding( ${index ++} ) @group( 0 ) var ${uniform.name} : ${textureType};` );
959
+ bindingSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var ${ uniform.name } : ${ textureType };` );
846
960
 
847
961
  } else if ( uniform.type === 'buffer' || uniform.type === 'storageBuffer' ) {
848
962
 
@@ -851,10 +965,10 @@ ${ flowData.code }
851
965
  const bufferCount = bufferNode.bufferCount;
852
966
 
853
967
  const bufferCountSnippet = bufferCount > 0 ? ', ' + bufferCount : '';
854
- const bufferSnippet = `\t${uniform.name} : array< ${bufferType}${bufferCountSnippet} >\n`;
855
- const bufferAccessMode = bufferNode.isStorageBufferNode ? 'storage,read_write' : 'uniform';
968
+ const bufferSnippet = `\t${ uniform.name } : array< ${ bufferType }${ bufferCountSnippet } >\n`;
969
+ const bufferAccessMode = bufferNode.isStorageBufferNode ? `storage, ${ this.getStorageAccess( bufferNode ) }` : 'uniform';
856
970
 
857
- bufferSnippets.push( this._getWGSLStructBinding( 'NodeBuffer_' + bufferNode.id, bufferSnippet, bufferAccessMode, index ++ ) );
971
+ bufferSnippets.push( this._getWGSLStructBinding( 'NodeBuffer_' + bufferNode.id, bufferSnippet, bufferAccessMode, uniformIndexes.binding ++, uniformIndexes.group ) );
858
972
 
859
973
  } else {
860
974
 
@@ -862,7 +976,8 @@ ${ flowData.code }
862
976
  const groupName = uniform.groupNode.name;
863
977
 
864
978
  const group = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = {
865
- index: index ++,
979
+ index: uniformIndexes.binding ++,
980
+ id: uniformIndexes.group,
866
981
  snippets: []
867
982
  } );
868
983
 
@@ -876,7 +991,7 @@ ${ flowData.code }
876
991
 
877
992
  const group = uniformGroups[ name ];
878
993
 
879
- structSnippets.push( this._getWGSLStructBinding( name, group.snippets.join( ',\n' ), 'uniform', group.index ) );
994
+ structSnippets.push( this._getWGSLStructBinding( name, group.snippets.join( ',\n' ), 'uniform', group.index, group.id ) );
880
995
 
881
996
  }
882
997
 
@@ -901,6 +1016,7 @@ ${ flowData.code }
901
1016
  stageData.structs = this.getStructs( shaderStage );
902
1017
  stageData.vars = this.getVars( shaderStage );
903
1018
  stageData.codes = this.getCodes( shaderStage );
1019
+ stageData.directives = this.getDirectives( shaderStage );
904
1020
 
905
1021
  //
906
1022
 
@@ -968,6 +1084,7 @@ ${ flowData.code }
968
1084
 
969
1085
  stageData.flow = flow;
970
1086
 
1087
+
971
1088
  }
972
1089
 
973
1090
  if ( this.material !== null ) {
@@ -1011,7 +1128,21 @@ ${ flowData.code }
1011
1128
 
1012
1129
  isAvailable( name ) {
1013
1130
 
1014
- return supports[ name ] === true;
1131
+ let result = supports[ name ];
1132
+
1133
+ if ( result === undefined ) {
1134
+
1135
+ if ( name === 'float32Filterable' ) {
1136
+
1137
+ result = this.renderer.hasFeature( 'float32-filterable' );
1138
+
1139
+ }
1140
+
1141
+ supports[ name ] = result;
1142
+
1143
+ }
1144
+
1145
+ return result;
1015
1146
 
1016
1147
  }
1017
1148
 
@@ -1045,6 +1176,8 @@ ${ flowData.code }
1045
1176
  _getWGSLVertexCode( shaderData ) {
1046
1177
 
1047
1178
  return `${ this.getSignature() }
1179
+ // directives
1180
+ ${shaderData.directives};
1048
1181
 
1049
1182
  // uniforms
1050
1183
  ${shaderData.uniforms}
@@ -1076,6 +1209,8 @@ fn main( ${shaderData.attributes} ) -> VaryingsStruct {
1076
1209
 
1077
1210
  return `${ this.getSignature() }
1078
1211
 
1212
+ diagnostic( off, derivative_uniformity );
1213
+
1079
1214
  // uniforms
1080
1215
  ${shaderData.uniforms}
1081
1216
 
@@ -1102,6 +1237,9 @@ fn main( ${shaderData.varyings} ) -> ${shaderData.returnType} {
1102
1237
  _getWGSLComputeCode( shaderData, workgroupSize ) {
1103
1238
 
1104
1239
  return `${ this.getSignature() }
1240
+ // directives
1241
+ ${shaderData.directives}
1242
+
1105
1243
  // system
1106
1244
  var<private> instanceIndex : u32;
1107
1245
 
@@ -1115,7 +1253,7 @@ ${shaderData.codes}
1115
1253
  fn main( ${shaderData.attributes} ) {
1116
1254
 
1117
1255
  // system
1118
- instanceIndex = id.x;
1256
+ instanceIndex = id.x + id.y * numWorkgroups.x * u32(${workgroupSize}) + id.z * numWorkgroups.x * numWorkgroups.y * u32(${workgroupSize});
1119
1257
 
1120
1258
  // vars
1121
1259
  ${shaderData.vars}
@@ -0,0 +1,159 @@
1
+ import NodeFunction from '../../../nodes/core/NodeFunction.js';
2
+ import NodeFunctionInput from '../../../nodes/core/NodeFunctionInput.js';
3
+
4
+ const declarationRegexp = /^[fn]*\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)\s*[\-\>]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i;
5
+ const propertiesRegexp = /([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/ig;
6
+
7
+ const wgslTypeLib = {
8
+ 'f32': 'float',
9
+ 'i32': 'int',
10
+ 'u32': 'uint',
11
+ 'bool': 'bool',
12
+
13
+ 'vec2<f32>': 'vec2',
14
+ 'vec2<i32>': 'ivec2',
15
+ 'vec2<u32>': 'uvec2',
16
+ 'vec2<bool>': 'bvec2',
17
+
18
+ 'vec2f': 'vec2',
19
+ 'vec2i': 'ivec2',
20
+ 'vec2u': 'uvec2',
21
+ 'vec2b': 'bvec2',
22
+
23
+ 'vec3<f32>': 'vec3',
24
+ 'vec3<i32>': 'ivec3',
25
+ 'vec3<u32>': 'uvec3',
26
+ 'vec3<bool>': 'bvec3',
27
+
28
+ 'vec3f': 'vec3',
29
+ 'vec3i': 'ivec3',
30
+ 'vec3u': 'uvec3',
31
+ 'vec3b': 'bvec3',
32
+
33
+ 'vec4<f32>': 'vec4',
34
+ 'vec4<i32>': 'ivec4',
35
+ 'vec4<u32>': 'uvec4',
36
+ 'vec4<bool>': 'bvec4',
37
+
38
+ 'vec4f': 'vec4',
39
+ 'vec4i': 'ivec4',
40
+ 'vec4u': 'uvec4',
41
+ 'vec4b': 'bvec4',
42
+
43
+ 'mat2x2<f32>': 'mat2',
44
+ 'mat2x2f': 'mat2',
45
+
46
+ 'mat3x3<f32>': 'mat3',
47
+ 'mat3x3f': 'mat3',
48
+
49
+ 'mat4x4<f32>': 'mat4',
50
+ 'mat4x4f': 'mat4',
51
+
52
+ 'sampler': 'sampler',
53
+
54
+ 'texture_1d': 'texture',
55
+
56
+ 'texture_2d': 'texture',
57
+ 'texture_2d_array': 'texture',
58
+ 'texture_multisampled_2d': 'cubeTexture',
59
+
60
+ 'texture_depth_2d': 'depthTexture',
61
+
62
+ 'texture_3d': 'texture3D',
63
+
64
+ 'texture_cube': 'cubeTexture',
65
+ 'texture_cube_array': 'cubeTexture',
66
+
67
+ 'texture_storage_1d': 'storageTexture',
68
+ 'texture_storage_2d': 'storageTexture',
69
+ 'texture_storage_2d_array': 'storageTexture',
70
+ 'texture_storage_3d': 'storageTexture'
71
+
72
+ };
73
+
74
+ const parse = ( source ) => {
75
+
76
+ source = source.trim();
77
+
78
+ const declaration = source.match( declarationRegexp );
79
+
80
+ if ( declaration !== null && declaration.length === 4 ) {
81
+
82
+ const inputsCode = declaration[ 2 ];
83
+ const propsMatches = [];
84
+ let match = null;
85
+
86
+ while ( ( match = propertiesRegexp.exec( inputsCode ) ) !== null ) {
87
+
88
+ propsMatches.push( { name: match[ 1 ], type: match[ 2 ] } );
89
+
90
+ }
91
+
92
+ // Process matches to correctly pair names and types
93
+ const inputs = [];
94
+ for ( let i = 0; i < propsMatches.length; i ++ ) {
95
+
96
+ const { name, type } = propsMatches[ i ];
97
+
98
+ let resolvedType = type;
99
+
100
+ if ( resolvedType.startsWith( 'texture' ) ) {
101
+
102
+ resolvedType = type.split( '<' )[ 0 ];
103
+
104
+ }
105
+
106
+ resolvedType = wgslTypeLib[ resolvedType ] || resolvedType;
107
+
108
+ inputs.push( new NodeFunctionInput( resolvedType, name ) );
109
+
110
+ }
111
+
112
+ const blockCode = source.substring( declaration[ 0 ].length );
113
+ const outputType = declaration[ 3 ] || 'void';
114
+
115
+ const name = declaration[ 1 ] !== undefined ? declaration[ 1 ] : '';
116
+ const type = wgslTypeLib[ outputType ] || outputType;
117
+
118
+ return {
119
+ type,
120
+ inputs,
121
+ name,
122
+ inputsCode,
123
+ blockCode,
124
+ outputType
125
+ };
126
+
127
+ } else {
128
+
129
+ throw new Error( 'FunctionNode: Function is not a WGSL code.' );
130
+
131
+ }
132
+
133
+ };
134
+
135
+ class WGSLNodeFunction extends NodeFunction {
136
+
137
+ constructor( source ) {
138
+
139
+ const { type, inputs, name, inputsCode, blockCode, outputType } = parse( source );
140
+
141
+ super( type, inputs, name );
142
+
143
+ this.inputsCode = inputsCode;
144
+ this.blockCode = blockCode;
145
+ this.outputType = outputType;
146
+
147
+ }
148
+
149
+ getCode( name = this.name ) {
150
+
151
+ const outputType = this.outputType !== 'void' ? '-> ' + this.outputType : '';
152
+
153
+ return `fn ${ name } ( ${ this.inputsCode.trim() } ) ${ outputType }` + this.blockCode;
154
+
155
+ }
156
+
157
+ }
158
+
159
+ export default WGSLNodeFunction;
@@ -1,6 +1,7 @@
1
- import { Float16BufferAttribute } from 'three';
2
1
  import { GPUInputStepMode } from './WebGPUConstants.js';
3
2
 
3
+ import { Float16BufferAttribute } from '../../../core/BufferAttribute.js';
4
+
4
5
  const typedArraysToVertexFormatPrefix = new Map( [
5
6
  [ Int8Array, [ 'sint8', 'snorm8' ]],
6
7
  [ Uint8Array, [ 'uint8', 'unorm8' ]],