super-three 0.164.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 (416) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +1273 -503
  3. package/build/three.module.js +1269 -504
  4. package/build/three.module.min.js +1 -1
  5. package/build/three.webgpu.js +76086 -0
  6. package/build/three.webgpu.min.js +6 -0
  7. package/examples/jsm/Addons.js +2 -1
  8. package/examples/jsm/controls/TransformControls.js +1 -1
  9. package/examples/jsm/csm/CSMShader.js +4 -4
  10. package/examples/jsm/environments/RoomEnvironment.js +1 -5
  11. package/examples/jsm/exporters/GLTFExporter.js +8 -4
  12. package/examples/jsm/exporters/USDZExporter.js +6 -4
  13. package/examples/jsm/geometries/TeapotGeometry.js +1 -1
  14. package/examples/jsm/helpers/ViewHelper.js +75 -61
  15. package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
  16. package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
  17. package/examples/jsm/lines/LineMaterial.js +1 -15
  18. package/examples/jsm/lines/LineSegments2.js +15 -0
  19. package/examples/jsm/lines/Wireframe.js +16 -1
  20. package/examples/jsm/lines/webgpu/Line2.js +20 -0
  21. package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
  22. package/examples/jsm/loaders/DRACOLoader.js +1 -1
  23. package/examples/jsm/loaders/FBXLoader.js +47 -58
  24. package/examples/jsm/loaders/GLTFLoader.js +12 -4
  25. package/examples/jsm/loaders/LDrawLoader.js +3 -2
  26. package/examples/jsm/loaders/MMDLoader.js +31 -12
  27. package/examples/jsm/loaders/MaterialXLoader.js +2 -9
  28. package/examples/jsm/loaders/USDZLoader.js +124 -76
  29. package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
  30. package/examples/jsm/loaders/VTKLoader.js +76 -3
  31. package/examples/jsm/misc/GPUComputationRenderer.js +9 -19
  32. package/examples/jsm/modifiers/CurveModifier.js +11 -9
  33. package/examples/jsm/modifiers/SimplifyModifier.js +2 -1
  34. package/examples/jsm/objects/InstancedPoints.js +2 -2
  35. package/examples/jsm/objects/Lensflare.js +2 -2
  36. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  37. package/examples/jsm/postprocessing/RenderTransitionPass.js +13 -38
  38. package/examples/jsm/postprocessing/SSAOPass.js +6 -9
  39. package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
  40. package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
  41. package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
  42. package/examples/jsm/shaders/ColorifyShader.js +1 -2
  43. package/examples/jsm/shaders/FXAAShader.js +0 -2
  44. package/examples/jsm/shaders/GTAOShader.js +1 -1
  45. package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
  46. package/examples/jsm/transpiler/GLSLDecoder.js +46 -4
  47. package/examples/jsm/transpiler/TSLEncoder.js +17 -15
  48. package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
  49. package/examples/jsm/utils/GPUStatsPanel.js +2 -0
  50. package/examples/jsm/utils/SortUtils.js +8 -5
  51. package/package.json +9 -7
  52. package/src/Three.WebGPU.js +194 -0
  53. package/src/Three.js +2 -0
  54. package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
  55. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
  56. package/src/animation/tracks/StringKeyframeTrack.js +10 -1
  57. package/src/constants.js +4 -1
  58. package/src/core/Object3D.js +24 -22
  59. package/src/core/Raycaster.js +6 -2
  60. package/src/extras/TextureUtils.js +210 -0
  61. package/src/lights/Light.js +1 -0
  62. package/src/lights/LightShadow.js +5 -0
  63. package/{examples/jsm/lights → src/lights/webgpu}/IESSpotLight.js +1 -1
  64. package/src/loaders/FileLoader.js +4 -0
  65. package/src/loaders/LoaderUtils.js +3 -1
  66. package/src/loaders/ObjectLoader.js +34 -2
  67. package/src/materials/Material.js +13 -4
  68. package/src/math/Box2.js +4 -4
  69. package/src/math/Box3.js +6 -6
  70. package/src/math/ColorManagement.js +10 -0
  71. package/src/math/Matrix2.js +54 -0
  72. package/src/math/Vector4.js +13 -0
  73. package/{examples/jsm → src}/nodes/Nodes.js +39 -20
  74. package/{examples/jsm → src}/nodes/accessors/BatchNode.js +28 -10
  75. package/src/nodes/accessors/BitangentNode.js +13 -0
  76. package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +36 -1
  77. package/{examples/jsm → src}/nodes/accessors/BufferNode.js +6 -0
  78. package/src/nodes/accessors/CameraNode.js +19 -0
  79. package/{examples/jsm → src}/nodes/accessors/CubeTextureNode.js +22 -5
  80. package/src/nodes/accessors/InstanceNode.js +140 -0
  81. package/{examples/jsm → src}/nodes/accessors/MaterialNode.js +24 -2
  82. package/{examples/jsm → src}/nodes/accessors/ModelNode.js +4 -0
  83. package/{examples/jsm → src}/nodes/accessors/MorphNode.js +24 -20
  84. package/src/nodes/accessors/NormalNode.js +14 -0
  85. package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +1 -1
  86. package/src/nodes/accessors/PositionNode.js +10 -0
  87. package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +7 -1
  88. package/src/nodes/accessors/ReflectVectorNode.js +10 -0
  89. package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +50 -1
  90. package/{examples/jsm/nodes/accessors/TextureStoreNode.js → src/nodes/accessors/StorageTextureNode.js} +28 -6
  91. package/src/nodes/accessors/TangentNode.js +23 -0
  92. package/src/nodes/accessors/Texture3DNode.js +100 -0
  93. package/{examples/jsm → src}/nodes/accessors/TextureNode.js +55 -18
  94. package/src/nodes/accessors/UVNode.js +3 -0
  95. package/{examples/jsm → src}/nodes/accessors/UniformsNode.js +7 -1
  96. package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +2 -1
  97. package/{examples/jsm → src}/nodes/code/ScriptableNode.js +14 -0
  98. package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +2 -1
  99. package/{examples/jsm → src}/nodes/core/AttributeNode.js +34 -8
  100. package/{examples/jsm → src}/nodes/core/CacheNode.js +7 -10
  101. package/{examples/jsm → src}/nodes/core/ContextNode.js +6 -0
  102. package/{examples/jsm → src}/nodes/core/IndexNode.js +6 -0
  103. package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
  104. package/src/nodes/core/MRTNode.js +76 -0
  105. package/{examples/jsm → src}/nodes/core/Node.js +33 -14
  106. package/{examples/jsm → src}/nodes/core/NodeBuilder.js +194 -45
  107. package/src/nodes/core/NodeCache.js +36 -0
  108. package/{examples/jsm → src}/nodes/core/NodeFrame.js +42 -0
  109. package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
  110. package/{examples/jsm → src}/nodes/core/NodeKeywords.js +1 -1
  111. package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
  112. package/{examples/jsm → src}/nodes/core/NodeUtils.js +6 -1
  113. package/{examples/jsm → src}/nodes/core/OutputStructNode.js +1 -5
  114. package/{examples/jsm → src}/nodes/core/PropertyNode.js +2 -0
  115. package/{examples/jsm → src}/nodes/core/TempNode.js +2 -2
  116. package/{examples/jsm → src}/nodes/core/UniformGroupNode.js +20 -0
  117. package/{examples/jsm → src}/nodes/core/UniformNode.js +10 -1
  118. package/{examples/jsm → src}/nodes/core/VarNode.js +2 -6
  119. package/src/nodes/core/VaryingNode.js +104 -0
  120. package/{examples/jsm → src}/nodes/display/AfterImageNode.js +24 -20
  121. package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +18 -21
  122. package/src/nodes/display/BloomNode.js +333 -0
  123. package/{examples/jsm → src}/nodes/display/ColorAdjustmentNode.js +7 -2
  124. package/{examples/jsm → src}/nodes/display/ColorSpaceNode.js +1 -1
  125. package/src/nodes/display/DenoiseNode.js +198 -0
  126. package/src/nodes/display/DepthOfFieldNode.js +119 -0
  127. package/src/nodes/display/DotScreenNode.js +75 -0
  128. package/src/nodes/display/FXAANode.js +327 -0
  129. package/src/nodes/display/FilmNode.js +52 -0
  130. package/{examples/jsm → src}/nodes/display/FrontFacingNode.js +2 -1
  131. package/src/nodes/display/GTAONode.js +324 -0
  132. package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +34 -17
  133. package/src/nodes/display/Lut3DNode.js +53 -0
  134. package/{examples/jsm → src}/nodes/display/NormalMapNode.js +1 -1
  135. package/src/nodes/display/PassNode.js +291 -0
  136. package/src/nodes/display/PixelationPassNode.js +201 -0
  137. package/src/nodes/display/RGBShiftNode.js +49 -0
  138. package/src/nodes/display/RenderOutputNode.js +56 -0
  139. package/src/nodes/display/SobelOperatorNode.js +121 -0
  140. package/{examples/jsm → src}/nodes/display/ToneMappingNode.js +44 -5
  141. package/src/nodes/display/TransitionNode.js +76 -0
  142. package/{examples/jsm → src}/nodes/display/ViewportDepthNode.js +39 -16
  143. package/{examples/jsm → src}/nodes/display/ViewportDepthTextureNode.js +2 -1
  144. package/{examples/jsm → src}/nodes/display/ViewportNode.js +3 -2
  145. package/{examples/jsm → src}/nodes/display/ViewportSharedTextureNode.js +2 -1
  146. package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +5 -2
  147. package/src/nodes/functions/BSDF/LTC.js +131 -0
  148. package/src/nodes/functions/BasicLightingModel.js +78 -0
  149. package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +5 -3
  150. package/{examples/jsm → src}/nodes/functions/PhysicalLightingModel.js +103 -18
  151. package/src/nodes/functions/ToonLightingModel.js +51 -0
  152. package/{examples/jsm → src}/nodes/geometry/RangeNode.js +19 -6
  153. package/{examples/jsm → src}/nodes/lighting/AONode.js +1 -4
  154. package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +1 -1
  155. package/src/nodes/lighting/AnalyticLightNode.js +333 -0
  156. package/src/nodes/lighting/BasicEnvironmentNode.js +26 -0
  157. package/src/nodes/lighting/BasicLightMapNode.js +29 -0
  158. package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +2 -3
  159. package/{examples/jsm → src}/nodes/lighting/EnvironmentNode.js +5 -4
  160. package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +2 -1
  161. package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +1 -1
  162. package/{examples/jsm → src}/nodes/lighting/LightingNode.js +2 -0
  163. package/{examples/jsm → src}/nodes/lighting/LightsNode.js +18 -3
  164. package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +2 -3
  165. package/src/nodes/lighting/RectAreaLightNode.js +97 -0
  166. package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +2 -3
  167. package/{examples/jsm → src}/nodes/loaders/NodeLoader.js +3 -1
  168. package/{examples/jsm → src}/nodes/loaders/NodeMaterialLoader.js +2 -1
  169. package/{examples/jsm → src}/nodes/loaders/NodeObjectLoader.js +2 -1
  170. package/{examples/jsm → src}/nodes/materials/InstancedPointsNodeMaterial.js +3 -3
  171. package/{examples/jsm → src}/nodes/materials/Line2NodeMaterial.js +4 -4
  172. package/{examples/jsm → src}/nodes/materials/LineBasicNodeMaterial.js +3 -3
  173. package/{examples/jsm → src}/nodes/materials/LineDashedNodeMaterial.js +4 -3
  174. package/{examples/jsm → src}/nodes/materials/Materials.js +3 -0
  175. package/src/nodes/materials/MeshBasicNodeMaterial.js +73 -0
  176. package/{examples/jsm → src}/nodes/materials/MeshLambertNodeMaterial.js +12 -3
  177. package/src/nodes/materials/MeshMatcapNodeMaterial.js +53 -0
  178. package/{examples/jsm → src}/nodes/materials/MeshNormalNodeMaterial.js +5 -3
  179. package/{examples/jsm → src}/nodes/materials/MeshPhongNodeMaterial.js +11 -3
  180. package/{examples/jsm → src}/nodes/materials/MeshPhysicalNodeMaterial.js +26 -8
  181. package/{examples/jsm → src}/nodes/materials/MeshStandardNodeMaterial.js +14 -3
  182. package/src/nodes/materials/MeshToonNodeMaterial.js +34 -0
  183. package/{examples/jsm → src}/nodes/materials/NodeMaterial.js +97 -24
  184. package/{examples/jsm → src}/nodes/materials/PointsNodeMaterial.js +3 -3
  185. package/{examples/jsm → src}/nodes/materials/ShadowNodeMaterial.js +3 -3
  186. package/{examples/jsm → src}/nodes/materials/SpriteNodeMaterial.js +3 -3
  187. package/src/nodes/materials/VolumeNodeMaterial.js +106 -0
  188. package/{examples/jsm → src}/nodes/materialx/lib/mx_hsv.js +9 -17
  189. package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +474 -577
  190. package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +2 -8
  191. package/{examples/jsm → src}/nodes/math/CondNode.js +13 -6
  192. package/{examples/jsm → src}/nodes/math/HashNode.js +2 -2
  193. package/{examples/jsm → src}/nodes/math/MathNode.js +14 -1
  194. package/{examples/jsm → src}/nodes/math/OperatorNode.js +6 -6
  195. package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
  196. package/{examples/jsm → src}/nodes/pmrem/PMREMNode.js +2 -1
  197. package/{examples/jsm → src}/nodes/shadernode/ShaderNode.js +57 -33
  198. package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +1 -1
  199. package/{examples/jsm → src}/nodes/utils/DiscardNode.js +1 -0
  200. package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +2 -0
  201. package/{examples/jsm → src}/nodes/utils/LoopNode.js +7 -6
  202. package/{examples/jsm → src}/nodes/utils/MatcapUVNode.js +1 -1
  203. package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +8 -2
  204. package/src/nodes/utils/RTTNode.js +130 -0
  205. package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +9 -1
  206. package/{examples/jsm → src}/nodes/utils/TimerNode.js +1 -1
  207. package/src/objects/BatchedMesh.js +232 -162
  208. package/src/objects/InstancedMesh.js +1 -1
  209. package/src/renderers/WebGLRenderer.js +312 -68
  210. package/{examples/jsm → src}/renderers/common/Attributes.js +4 -1
  211. package/{examples/jsm → src}/renderers/common/Backend.js +30 -27
  212. package/{examples/jsm → src}/renderers/common/Background.js +9 -3
  213. package/src/renderers/common/BindGroup.js +16 -0
  214. package/{examples/jsm → src}/renderers/common/Bindings.js +54 -22
  215. package/src/renderers/common/ChainMap.js +59 -0
  216. package/{examples/jsm → src}/renderers/common/ClippingContext.js +8 -6
  217. package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
  218. package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +7 -1
  219. package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
  220. package/{examples/jsm → src}/renderers/common/Info.js +34 -6
  221. package/{examples/jsm → src}/renderers/common/Pipelines.js +2 -2
  222. package/src/renderers/common/PostProcessing.js +87 -0
  223. package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +6 -3
  224. package/src/renderers/common/RenderBundle.js +18 -0
  225. package/src/renderers/common/RenderBundles.js +38 -0
  226. package/{examples/jsm → src}/renderers/common/RenderContext.js +1 -1
  227. package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
  228. package/{examples/jsm → src}/renderers/common/RenderList.js +9 -0
  229. package/{examples/jsm → src}/renderers/common/RenderObject.js +50 -11
  230. package/{examples/jsm → src}/renderers/common/Renderer.js +220 -40
  231. package/{examples/jsm → src}/renderers/common/SampledTexture.js +2 -2
  232. package/{examples/jsm → src}/renderers/common/StorageBufferAttribute.js +1 -1
  233. package/{examples/jsm → src}/renderers/common/StorageInstancedBufferAttribute.js +1 -1
  234. package/{examples/jsm → src}/renderers/common/StorageTexture.js +2 -1
  235. package/{examples/jsm → src}/renderers/common/Textures.js +6 -2
  236. package/{examples/jsm → src}/renderers/common/Uniform.js +10 -5
  237. package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
  238. package/{examples/jsm → src}/renderers/common/extras/PMREMGenerator.js +13 -12
  239. package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
  240. package/{examples/jsm → src}/renderers/common/nodes/NodeSampledTexture.js +19 -4
  241. package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +8 -1
  242. package/{examples/jsm → src}/renderers/common/nodes/NodeStorageBuffer.js +5 -1
  243. package/{examples/jsm → src}/renderers/common/nodes/NodeUniform.js +3 -3
  244. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformBuffer.js +2 -1
  245. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformsGroup.js +2 -8
  246. package/{examples/jsm → src}/renderers/common/nodes/Nodes.js +37 -16
  247. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +31 -1
  248. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
  249. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
  250. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
  251. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +0 -9
  252. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -10
  253. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
  254. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
  255. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
  256. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
  257. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
  258. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
  259. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
  260. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +45 -13
  261. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -4
  262. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +3 -0
  263. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +3 -3
  264. package/src/renderers/shaders/ShaderLib/depth.glsl.js +8 -0
  265. package/src/renderers/shaders/UniformsLib.js +3 -0
  266. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  267. package/src/renderers/webgl/WebGLBackground.js +6 -0
  268. package/src/renderers/webgl/WebGLBufferRenderer.js +6 -19
  269. package/src/renderers/webgl/WebGLExtensions.js +3 -1
  270. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +6 -18
  271. package/src/renderers/webgl/WebGLLights.js +15 -12
  272. package/src/renderers/webgl/WebGLMaterials.js +1 -5
  273. package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
  274. package/src/renderers/webgl/WebGLProgram.js +28 -31
  275. package/src/renderers/webgl/WebGLPrograms.js +15 -15
  276. package/src/renderers/webgl/WebGLRenderStates.js +2 -2
  277. package/src/renderers/webgl/WebGLTextures.js +100 -70
  278. package/src/renderers/webgl/WebGLUniforms.js +12 -2
  279. package/src/renderers/webgl/WebGLUniformsGroups.js +7 -7
  280. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +156 -54
  281. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +188 -41
  282. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +2 -2
  283. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +1 -0
  284. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLExtensions.js +2 -0
  285. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLState.js +1 -1
  286. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +126 -7
  287. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
  288. package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +212 -78
  289. package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +2 -2
  290. package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +245 -49
  291. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
  292. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  293. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +30 -14
  294. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +9 -1
  295. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +74 -24
  296. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +101 -25
  297. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +24 -3
  298. package/src/renderers/webxr/WebXRDepthSensing.js +9 -3
  299. package/src/renderers/webxr/WebXRManager.js +12 -2
  300. package/src/textures/CompressedArrayTexture.js +14 -0
  301. package/src/textures/DataArrayTexture.js +14 -0
  302. package/src/textures/DepthTexture.js +1 -3
  303. package/src/utils.js +30 -1
  304. package/examples/jsm/nodes/accessors/BitangentNode.js +0 -89
  305. package/examples/jsm/nodes/accessors/CameraNode.js +0 -119
  306. package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
  307. package/examples/jsm/nodes/accessors/NormalNode.js +0 -106
  308. package/examples/jsm/nodes/accessors/PositionNode.js +0 -104
  309. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +0 -35
  310. package/examples/jsm/nodes/accessors/TangentNode.js +0 -109
  311. package/examples/jsm/nodes/accessors/UVNode.js +0 -47
  312. package/examples/jsm/nodes/core/NodeCache.js +0 -26
  313. package/examples/jsm/nodes/core/VaryingNode.js +0 -65
  314. package/examples/jsm/nodes/display/PassNode.js +0 -199
  315. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -255
  316. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
  317. package/examples/jsm/renderers/common/ChainMap.js +0 -89
  318. package/examples/jsm/renderers/common/PostProcessing.js +0 -33
  319. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
  320. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
  321. /package/{examples/jsm → src}/nodes/accessors/AccessorsUtils.js +0 -0
  322. /package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +0 -0
  323. /package/{examples/jsm → src}/nodes/accessors/InstancedPointsMaterialNode.js +0 -0
  324. /package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +0 -0
  325. /package/{examples/jsm → src}/nodes/accessors/ModelViewProjectionNode.js +0 -0
  326. /package/{examples/jsm → src}/nodes/accessors/PointUVNode.js +0 -0
  327. /package/{examples/jsm → src}/nodes/accessors/RendererReferenceNode.js +0 -0
  328. /package/{examples/jsm → src}/nodes/accessors/SceneNode.js +0 -0
  329. /package/{examples/jsm → src}/nodes/accessors/SkinningNode.js +0 -0
  330. /package/{examples/jsm → src}/nodes/accessors/TextureBicubicNode.js +0 -0
  331. /package/{examples/jsm → src}/nodes/accessors/TextureSizeNode.js +0 -0
  332. /package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +0 -0
  333. /package/{examples/jsm → src}/nodes/code/CodeNode.js +0 -0
  334. /package/{examples/jsm → src}/nodes/code/ExpressionNode.js +0 -0
  335. /package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +0 -0
  336. /package/{examples/jsm → src}/nodes/code/FunctionNode.js +0 -0
  337. /package/{examples/jsm → src}/nodes/core/AssignNode.js +0 -0
  338. /package/{examples/jsm → src}/nodes/core/BypassNode.js +0 -0
  339. /package/{examples/jsm → src}/nodes/core/ConstNode.js +0 -0
  340. /package/{examples/jsm → src}/nodes/core/InputNode.js +0 -0
  341. /package/{examples/jsm → src}/nodes/core/NodeAttribute.js +0 -0
  342. /package/{examples/jsm → src}/nodes/core/NodeCode.js +0 -0
  343. /package/{examples/jsm → src}/nodes/core/NodeFunctionInput.js +0 -0
  344. /package/{examples/jsm → src}/nodes/core/NodeParser.js +0 -0
  345. /package/{examples/jsm → src}/nodes/core/NodeVar.js +0 -0
  346. /package/{examples/jsm → src}/nodes/core/NodeVarying.js +0 -0
  347. /package/{examples/jsm → src}/nodes/core/ParameterNode.js +0 -0
  348. /package/{examples/jsm → src}/nodes/core/StackNode.js +0 -0
  349. /package/{examples/jsm → src}/nodes/core/StructTypeNode.js +0 -0
  350. /package/{examples/jsm → src}/nodes/core/UniformGroup.js +0 -0
  351. /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
  352. /package/{examples/jsm → src}/nodes/display/BlendModeNode.js +0 -0
  353. /package/{examples/jsm → src}/nodes/display/BumpMapNode.js +0 -0
  354. /package/{examples/jsm → src}/nodes/display/PosterizeNode.js +0 -0
  355. /package/{examples/jsm → src}/nodes/fog/FogExp2Node.js +0 -0
  356. /package/{examples/jsm → src}/nodes/fog/FogNode.js +0 -0
  357. /package/{examples/jsm → src}/nodes/fog/FogRangeNode.js +0 -0
  358. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_GGX.js +0 -0
  359. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +0 -0
  360. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +0 -0
  361. /package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +0 -0
  362. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +0 -0
  363. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX_Anisotropic.js +0 -0
  364. /package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +0 -0
  365. /package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +0 -0
  366. /package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +0 -0
  367. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +0 -0
  368. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +0 -0
  369. /package/{examples/jsm → src}/nodes/functions/ShadowMaskModel.js +0 -0
  370. /package/{examples/jsm → src}/nodes/functions/material/getGeometryRoughness.js +0 -0
  371. /package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +0 -0
  372. /package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +0 -0
  373. /package/{examples/jsm → src}/nodes/lighting/IrradianceNode.js +0 -0
  374. /package/{examples/jsm → src}/nodes/lighting/LightNode.js +0 -0
  375. /package/{examples/jsm → src}/nodes/lighting/LightUtils.js +0 -0
  376. /package/{examples/jsm → src}/nodes/lighting/LightingContextNode.js +0 -0
  377. /package/{examples/jsm → src}/nodes/materials/MeshSSSNodeMaterial.js +0 -0
  378. /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
  379. /package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +0 -0
  380. /package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -0
  381. /package/{examples/jsm → src}/nodes/math/TriNoise3D.js +0 -0
  382. /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
  383. /package/{examples/jsm → src}/nodes/pmrem/PMREMUtils.js +0 -0
  384. /package/{examples/jsm → src}/nodes/procedural/CheckerNode.js +0 -0
  385. /package/{examples/jsm → src}/nodes/utils/ConvertNode.js +0 -0
  386. /package/{examples/jsm → src}/nodes/utils/EquirectUVNode.js +0 -0
  387. /package/{examples/jsm → src}/nodes/utils/JoinNode.js +0 -0
  388. /package/{examples/jsm → src}/nodes/utils/OscNode.js +0 -0
  389. /package/{examples/jsm → src}/nodes/utils/PackingNode.js +0 -0
  390. /package/{examples/jsm → src}/nodes/utils/RemapNode.js +0 -0
  391. /package/{examples/jsm → src}/nodes/utils/RotateNode.js +0 -0
  392. /package/{examples/jsm → src}/nodes/utils/RotateUVNode.js +0 -0
  393. /package/{examples/jsm → src}/nodes/utils/SetNode.js +0 -0
  394. /package/{examples/jsm → src}/nodes/utils/SplitNode.js +0 -0
  395. /package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +0 -0
  396. /package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +0 -0
  397. /package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +0 -0
  398. /package/{examples/jsm → src}/renderers/common/Animation.js +0 -0
  399. /package/{examples/jsm → src}/renderers/common/Binding.js +0 -0
  400. /package/{examples/jsm → src}/renderers/common/Buffer.js +0 -0
  401. /package/{examples/jsm → src}/renderers/common/BufferUtils.js +0 -0
  402. /package/{examples/jsm → src}/renderers/common/ComputePipeline.js +0 -0
  403. /package/{examples/jsm → src}/renderers/common/Constants.js +0 -0
  404. /package/{examples/jsm → src}/renderers/common/DataMap.js +0 -0
  405. /package/{examples/jsm → src}/renderers/common/Pipeline.js +0 -0
  406. /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
  407. /package/{examples/jsm → src}/renderers/common/RenderLists.js +0 -0
  408. /package/{examples/jsm → src}/renderers/common/RenderObjects.js +0 -0
  409. /package/{examples/jsm → src}/renderers/common/RenderPipeline.js +0 -0
  410. /package/{examples/jsm → src}/renderers/common/Sampler.js +0 -0
  411. /package/{examples/jsm → src}/renderers/common/StorageBuffer.js +0 -0
  412. /package/{examples/jsm → src}/renderers/common/UniformBuffer.js +0 -0
  413. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBufferRenderer.js +0 -0
  414. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLCapabilities.js +0 -0
  415. /package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeParser.js +0 -0
  416. /package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +0 -0
@@ -1,9 +1,7 @@
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';
6
- import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
4
+ import { NodeSampledTexture, NodeSampledCubeTexture, NodeSampledTexture3D } from '../../common/nodes/NodeSampledTexture.js';
7
5
 
8
6
  import NodeUniformBuffer from '../../common/nodes/NodeUniformBuffer.js';
9
7
  import NodeStorageBuffer from '../../common/nodes/NodeStorageBuffer.js';
@@ -13,6 +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';
14
+ import { GPUBufferBindingType, GPUStorageTextureAccess } from '../utils/WebGPUConstants.js';
15
+
16
+ import { NoColorSpace, FloatType } from '../../../constants.js';
16
17
 
17
18
  // GPUShaderStage is not defined in browsers not supporting WebGPU
18
19
  const GPUShaderStage = self.GPUShaderStage;
@@ -25,6 +26,7 @@ const gpuShaderStageLib = {
25
26
 
26
27
  const supports = {
27
28
  instance: true,
29
+ swizzleAssign: false,
28
30
  storageBuffer: true
29
31
  };
30
32
 
@@ -124,20 +126,45 @@ fn threejs_repeatWrapping( uv : vec2<f32>, dimension : vec2<u32> ) -> vec2<u32>
124
126
 
125
127
  return ( ( uvScaled % dimension ) + dimension ) % dimension;
126
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
+
127
152
  }
128
153
  ` )
129
154
  };
130
155
 
131
156
  class WGSLNodeBuilder extends NodeBuilder {
132
157
 
133
- constructor( object, renderer, scene = null ) {
158
+ constructor( object, renderer ) {
134
159
 
135
- super( object, renderer, new WGSLNodeParser(), scene );
160
+ super( object, renderer, new WGSLNodeParser() );
136
161
 
137
162
  this.uniformGroups = {};
138
163
 
139
164
  this.builtins = {};
140
165
 
166
+ this.directives = {};
167
+
141
168
  }
142
169
 
143
170
  needsColorSpaceToLinear( texture ) {
@@ -160,9 +187,13 @@ class WGSLNodeBuilder extends NodeBuilder {
160
187
 
161
188
  }
162
189
 
190
+ } else if ( this.isFilteredTexture( texture ) ) {
191
+
192
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet );
193
+
163
194
  } else {
164
195
 
165
- return this.generateTextureLod( texture, textureProperty, uvSnippet );
196
+ return this.generateTextureLod( texture, textureProperty, uvSnippet, '0' );
166
197
 
167
198
  }
168
199
 
@@ -188,6 +219,10 @@ class WGSLNodeBuilder extends NodeBuilder {
188
219
 
189
220
  return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
190
221
 
222
+ } else if ( this.isFilteredTexture( texture ) ) {
223
+
224
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet );
225
+
191
226
  } else {
192
227
 
193
228
  return this.generateTextureLod( texture, textureProperty, uvSnippet, levelSnippet );
@@ -196,11 +231,19 @@ class WGSLNodeBuilder extends NodeBuilder {
196
231
 
197
232
  }
198
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
+
199
242
  generateTextureLod( texture, textureProperty, uvSnippet, levelSnippet = '0' ) {
200
243
 
201
244
  this._include( 'repeatWrapping' );
202
245
 
203
- const dimension = `textureDimensions( ${ textureProperty }, 0 )`;
246
+ const dimension = texture.isMultisampleRenderTargetTexture === true ? `textureDimensions( ${ textureProperty } )` : `textureDimensions( ${ textureProperty }, 0 )`;
204
247
 
205
248
  return `textureLoad( ${ textureProperty }, threejs_repeatWrapping( ${ uvSnippet }, ${ dimension } ), i32( ${ levelSnippet } ) )`;
206
249
 
@@ -228,7 +271,7 @@ class WGSLNodeBuilder extends NodeBuilder {
228
271
 
229
272
  isUnfilterable( texture ) {
230
273
 
231
- 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;
232
275
 
233
276
  }
234
277
 
@@ -301,6 +344,20 @@ class WGSLNodeBuilder extends NodeBuilder {
301
344
 
302
345
  }
303
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
+
304
361
  getPropertyName( node, shaderStage = this.shaderStage ) {
305
362
 
306
363
  if ( node.isNodeVarying === true && node.needsInterpolation === true ) {
@@ -316,7 +373,7 @@ class WGSLNodeBuilder extends NodeBuilder {
316
373
  const name = node.name;
317
374
  const type = node.type;
318
375
 
319
- if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' ) {
376
+ if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
320
377
 
321
378
  return name;
322
379
 
@@ -336,6 +393,12 @@ class WGSLNodeBuilder extends NodeBuilder {
336
393
 
337
394
  }
338
395
 
396
+ getOutputStructName() {
397
+
398
+ return 'output';
399
+
400
+ }
401
+
339
402
  _getUniformGroupCount( shaderStage ) {
340
403
 
341
404
  return Object.keys( this.uniforms[ shaderStage ] ).length;
@@ -358,6 +421,49 @@ class WGSLNodeBuilder extends NodeBuilder {
358
421
 
359
422
  }
360
423
 
424
+ getStorageAccess( node ) {
425
+
426
+ if ( node.isStorageTextureNode ) {
427
+
428
+ switch ( node.access ) {
429
+
430
+ case GPUStorageTextureAccess.ReadOnly:
431
+
432
+ return 'read';
433
+
434
+ case GPUStorageTextureAccess.WriteOnly:
435
+
436
+ return 'write';
437
+
438
+ default:
439
+
440
+ return 'read_write';
441
+
442
+ }
443
+
444
+ } else {
445
+
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
+ }
462
+
463
+ }
464
+
465
+ }
466
+
361
467
  getUniformFromNode( node, type, shaderStage, name = null ) {
362
468
 
363
469
  const uniformNode = super.getUniformFromNode( node, type, shaderStage, name );
@@ -367,28 +473,35 @@ class WGSLNodeBuilder extends NodeBuilder {
367
473
 
368
474
  let uniformGPU;
369
475
 
370
- const bindings = this.bindings[ shaderStage ];
476
+ const group = node.groupNode;
477
+ const groupName = group.name;
478
+
479
+ const bindings = this.getBindGroupArray( groupName, shaderStage );
371
480
 
372
- if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' ) {
481
+ if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
373
482
 
374
483
  let texture = null;
375
484
 
376
485
  if ( type === 'texture' || type === 'storageTexture' ) {
377
486
 
378
- texture = new NodeSampledTexture( uniformNode.name, uniformNode.node );
487
+ texture = new NodeSampledTexture( uniformNode.name, uniformNode.node, group, node.access ? node.access : null );
379
488
 
380
489
  } else if ( type === 'cubeTexture' ) {
381
490
 
382
- texture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node );
491
+ texture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group, node.access ? node.access : null );
492
+
493
+ } else if ( type === 'texture3D' ) {
494
+
495
+ texture = new NodeSampledTexture3D( uniformNode.name, uniformNode.node, group, node.access ? node.access : null );
383
496
 
384
497
  }
385
498
 
386
- texture.store = node.isStoreTextureNode === true;
499
+ texture.store = node.isStorageTextureNode === true;
387
500
  texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
388
501
 
389
502
  if ( shaderStage === 'fragment' && this.isUnfilterable( node.value ) === false && texture.store === false ) {
390
503
 
391
- const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node );
504
+ const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node, group );
392
505
  sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
393
506
 
394
507
  bindings.push( sampler, texture );
@@ -406,7 +519,7 @@ class WGSLNodeBuilder extends NodeBuilder {
406
519
  } else if ( type === 'buffer' || type === 'storageBuffer' ) {
407
520
 
408
521
  const bufferClass = type === 'storageBuffer' ? NodeStorageBuffer : NodeUniformBuffer;
409
- const buffer = new bufferClass( node );
522
+ const buffer = new bufferClass( node, group );
410
523
  buffer.setVisibility( gpuShaderStageLib[ shaderStage ] );
411
524
 
412
525
  bindings.push( buffer );
@@ -415,9 +528,6 @@ class WGSLNodeBuilder extends NodeBuilder {
415
528
 
416
529
  } else {
417
530
 
418
- const group = node.groupNode;
419
- const groupName = group.name;
420
-
421
531
  const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
422
532
 
423
533
  let uniformsGroup = uniformsStage[ groupName ];
@@ -441,24 +551,12 @@ class WGSLNodeBuilder extends NodeBuilder {
441
551
 
442
552
  nodeData.uniformGPU = uniformGPU;
443
553
 
444
- if ( shaderStage === 'vertex' ) {
445
-
446
- this.bindingsOffset[ 'fragment' ] = bindings.length;
447
-
448
- }
449
-
450
554
  }
451
555
 
452
556
  return uniformNode;
453
557
 
454
558
  }
455
559
 
456
- isReference( type ) {
457
-
458
- return super.isReference( type ) || type === 'texture_2d' || type === 'texture_cube' || type === 'texture_depth_2d' || type === 'texture_storage_2d';
459
-
460
- }
461
-
462
560
  getBuiltin( name, property, type, shaderStage = this.shaderStage ) {
463
561
 
464
562
  const map = this.builtins[ shaderStage ] || ( this.builtins[ shaderStage ] = new Map() );
@@ -529,6 +627,12 @@ ${ flowData.code }
529
627
 
530
628
  }
531
629
 
630
+ getDrawIndex() {
631
+
632
+ return null;
633
+
634
+ }
635
+
532
636
  getFrontFacing() {
533
637
 
534
638
  return this.getBuiltin( 'front_facing', 'isFront', 'bool' );
@@ -553,6 +657,50 @@ ${ flowData.code }
553
657
 
554
658
  }
555
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
+
556
704
  getBuiltins( shaderStage ) {
557
705
 
558
706
  const snippets = [];
@@ -579,6 +727,9 @@ ${ flowData.code }
579
727
  if ( shaderStage === 'compute' ) {
580
728
 
581
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' );
582
733
 
583
734
  }
584
735
 
@@ -618,6 +769,10 @@ ${ flowData.code }
618
769
 
619
770
  }
620
771
 
772
+ const builtins = this.getBuiltins( 'output' );
773
+
774
+ if ( builtins ) snippets.push( builtins );
775
+
621
776
  return snippets.join( ',\n' );
622
777
 
623
778
  }
@@ -636,8 +791,11 @@ ${ flowData.code }
636
791
  snippet += this.getStructMembers( struct );
637
792
  snippet += '\n}';
638
793
 
794
+
639
795
  snippets.push( snippet );
640
796
 
797
+ snippets.push( `\nvar<private> output : ${ name };\n\n` );
798
+
641
799
  }
642
800
 
643
801
  return snippets.join( '\n\n' );
@@ -730,23 +888,24 @@ ${ flowData.code }
730
888
  const structSnippets = [];
731
889
  const uniformGroups = {};
732
890
 
733
- let index = this.bindingsOffset[ shaderStage ];
734
-
735
891
  for ( const uniform of uniforms ) {
736
892
 
737
- if ( uniform.type === 'texture' || uniform.type === 'cubeTexture' || uniform.type === 'storageTexture' ) {
893
+ const groundName = uniform.groupNode.name;
894
+ const uniformIndexes = this.bindingsIndexes[ groundName ];
895
+
896
+ if ( uniform.type === 'texture' || uniform.type === 'cubeTexture' || uniform.type === 'storageTexture' || uniform.type === 'texture3D' ) {
738
897
 
739
898
  const texture = uniform.node.value;
740
899
 
741
- if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false && uniform.node.isStoreTextureNode !== true ) {
900
+ if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) {
742
901
 
743
902
  if ( texture.isDepthTexture === true && texture.compareFunction !== null ) {
744
903
 
745
- 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;` );
746
905
 
747
906
  } else {
748
907
 
749
- 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;` );
750
909
 
751
910
  }
752
911
 
@@ -754,6 +913,14 @@ ${ flowData.code }
754
913
 
755
914
  let textureType;
756
915
 
916
+ let multisampled = '';
917
+
918
+ if ( texture.isMultisampleRenderTargetTexture === true ) {
919
+
920
+ multisampled = '_multisampled';
921
+
922
+ }
923
+
757
924
  if ( texture.isCubeTexture === true ) {
758
925
 
759
926
  textureType = 'texture_cube<f32>';
@@ -764,27 +931,32 @@ ${ flowData.code }
764
931
 
765
932
  } else if ( texture.isDepthTexture === true ) {
766
933
 
767
- textureType = 'texture_depth_2d';
934
+ textureType = `texture_depth${multisampled}_2d`;
768
935
 
769
936
  } else if ( texture.isVideoTexture === true ) {
770
937
 
771
938
  textureType = 'texture_external';
772
939
 
773
- } else if ( uniform.node.isStoreTextureNode === true ) {
940
+ } else if ( texture.isData3DTexture === true ) {
941
+
942
+ textureType = 'texture_3d<f32>';
943
+
944
+ } else if ( uniform.node.isStorageTextureNode === true ) {
774
945
 
775
946
  const format = getFormat( texture );
947
+ const access = this.getStorageAccess( uniform.node );
776
948
 
777
- textureType = `texture_storage_2d<${ format }, write>`;
949
+ textureType = `texture_storage_2d<${ format }, ${ access }>`;
778
950
 
779
951
  } else {
780
952
 
781
953
  const componentPrefix = this.getComponentTypeFromTexture( texture ).charAt( 0 );
782
954
 
783
- textureType = `texture_2d<${ componentPrefix }32>`;
955
+ textureType = `texture${multisampled}_2d<${ componentPrefix }32>`;
784
956
 
785
957
  }
786
958
 
787
- bindingSnippets.push( `@binding( ${index ++} ) @group( 0 ) var ${uniform.name} : ${textureType};` );
959
+ bindingSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var ${ uniform.name } : ${ textureType };` );
788
960
 
789
961
  } else if ( uniform.type === 'buffer' || uniform.type === 'storageBuffer' ) {
790
962
 
@@ -793,10 +965,10 @@ ${ flowData.code }
793
965
  const bufferCount = bufferNode.bufferCount;
794
966
 
795
967
  const bufferCountSnippet = bufferCount > 0 ? ', ' + bufferCount : '';
796
- const bufferSnippet = `\t${uniform.name} : array< ${bufferType}${bufferCountSnippet} >\n`;
797
- 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';
798
970
 
799
- bufferSnippets.push( this._getWGSLStructBinding( 'NodeBuffer_' + bufferNode.id, bufferSnippet, bufferAccessMode, index ++ ) );
971
+ bufferSnippets.push( this._getWGSLStructBinding( 'NodeBuffer_' + bufferNode.id, bufferSnippet, bufferAccessMode, uniformIndexes.binding ++, uniformIndexes.group ) );
800
972
 
801
973
  } else {
802
974
 
@@ -804,7 +976,8 @@ ${ flowData.code }
804
976
  const groupName = uniform.groupNode.name;
805
977
 
806
978
  const group = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = {
807
- index: index ++,
979
+ index: uniformIndexes.binding ++,
980
+ id: uniformIndexes.group,
808
981
  snippets: []
809
982
  } );
810
983
 
@@ -818,7 +991,7 @@ ${ flowData.code }
818
991
 
819
992
  const group = uniformGroups[ name ];
820
993
 
821
- 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 ) );
822
995
 
823
996
  }
824
997
 
@@ -843,6 +1016,7 @@ ${ flowData.code }
843
1016
  stageData.structs = this.getStructs( shaderStage );
844
1017
  stageData.vars = this.getVars( shaderStage );
845
1018
  stageData.codes = this.getCodes( shaderStage );
1019
+ stageData.directives = this.getDirectives( shaderStage );
846
1020
 
847
1021
  //
848
1022
 
@@ -910,6 +1084,7 @@ ${ flowData.code }
910
1084
 
911
1085
  stageData.flow = flow;
912
1086
 
1087
+
913
1088
  }
914
1089
 
915
1090
  if ( this.material !== null ) {
@@ -953,7 +1128,21 @@ ${ flowData.code }
953
1128
 
954
1129
  isAvailable( name ) {
955
1130
 
956
- 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;
957
1146
 
958
1147
  }
959
1148
 
@@ -987,6 +1176,8 @@ ${ flowData.code }
987
1176
  _getWGSLVertexCode( shaderData ) {
988
1177
 
989
1178
  return `${ this.getSignature() }
1179
+ // directives
1180
+ ${shaderData.directives};
990
1181
 
991
1182
  // uniforms
992
1183
  ${shaderData.uniforms}
@@ -1018,6 +1209,8 @@ fn main( ${shaderData.attributes} ) -> VaryingsStruct {
1018
1209
 
1019
1210
  return `${ this.getSignature() }
1020
1211
 
1212
+ diagnostic( off, derivative_uniformity );
1213
+
1021
1214
  // uniforms
1022
1215
  ${shaderData.uniforms}
1023
1216
 
@@ -1044,6 +1237,9 @@ fn main( ${shaderData.varyings} ) -> ${shaderData.returnType} {
1044
1237
  _getWGSLComputeCode( shaderData, workgroupSize ) {
1045
1238
 
1046
1239
  return `${ this.getSignature() }
1240
+ // directives
1241
+ ${shaderData.directives}
1242
+
1047
1243
  // system
1048
1244
  var<private> instanceIndex : u32;
1049
1245
 
@@ -1057,7 +1253,7 @@ ${shaderData.codes}
1057
1253
  fn main( ${shaderData.attributes} ) {
1058
1254
 
1059
1255
  // system
1060
- instanceIndex = id.x;
1256
+ instanceIndex = id.x + id.y * numWorkgroups.x * u32(${workgroupSize}) + id.z * numWorkgroups.x * numWorkgroups.y * u32(${workgroupSize});
1061
1257
 
1062
1258
  // vars
1063
1259
  ${shaderData.vars}