super-three 0.165.0 → 0.168.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 (462) hide show
  1. package/build/three.cjs +854 -410
  2. package/build/three.module.js +849 -411
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +77755 -0
  5. package/build/three.webgpu.min.js +6 -0
  6. package/examples/jsm/Addons.js +5 -2
  7. package/examples/jsm/animation/AnimationClipCreator.js +1 -1
  8. package/examples/jsm/capabilities/WebGL.js +27 -21
  9. package/examples/jsm/controls/ArcballControls.js +174 -158
  10. package/examples/jsm/controls/DragControls.js +260 -132
  11. package/examples/jsm/controls/FirstPersonControls.js +175 -163
  12. package/examples/jsm/controls/FlyControls.js +194 -188
  13. package/examples/jsm/controls/OrbitControls.js +777 -786
  14. package/examples/jsm/controls/PointerLockControls.js +24 -15
  15. package/examples/jsm/controls/TrackballControls.js +453 -452
  16. package/examples/jsm/csm/CSMShader.js +4 -4
  17. package/examples/jsm/effects/AnaglyphEffect.js +6 -13
  18. package/examples/jsm/effects/ParallaxBarrierEffect.js +17 -11
  19. package/examples/jsm/effects/StereoEffect.js +6 -1
  20. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  21. package/examples/jsm/exporters/GLTFExporter.js +13 -4
  22. package/examples/jsm/exporters/USDZExporter.js +29 -8
  23. package/examples/jsm/geometries/TeapotGeometry.js +1 -1
  24. package/examples/jsm/helpers/LightProbeHelper.js +42 -43
  25. package/examples/jsm/helpers/ViewHelper.js +51 -2
  26. package/examples/jsm/libs/tween.module.js +64 -75
  27. package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
  28. package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
  29. package/examples/jsm/lines/webgpu/Line2.js +20 -0
  30. package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
  31. package/examples/jsm/loaders/FBXLoader.js +23 -45
  32. package/examples/jsm/loaders/GLTFLoader.js +10 -4
  33. package/examples/jsm/loaders/KTX2Loader.js +19 -7
  34. package/examples/jsm/loaders/MaterialXLoader.js +10 -10
  35. package/examples/jsm/loaders/PCDLoader.js +9 -9
  36. package/examples/jsm/loaders/USDZLoader.js +124 -76
  37. package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
  38. package/examples/jsm/loaders/VTKLoader.js +76 -3
  39. package/examples/jsm/misc/GPUComputationRenderer.js +9 -19
  40. package/examples/jsm/modifiers/SimplifyModifier.js +2 -1
  41. package/examples/jsm/objects/InstancedPoints.js +2 -2
  42. package/examples/jsm/objects/SkyMesh.js +188 -0
  43. package/examples/jsm/objects/Water2Mesh.js +159 -0
  44. package/examples/jsm/objects/WaterMesh.js +102 -0
  45. package/examples/jsm/physics/RapierPhysics.js +20 -0
  46. package/examples/jsm/postprocessing/OutlinePass.js +31 -46
  47. package/examples/jsm/postprocessing/RenderTransitionPass.js +13 -38
  48. package/examples/jsm/postprocessing/SSAARenderPass.js +3 -1
  49. package/examples/jsm/postprocessing/SSAOPass.js +6 -9
  50. package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
  51. package/examples/jsm/shaders/BleachBypassShader.js +1 -2
  52. package/examples/jsm/shaders/ColorifyShader.js +1 -2
  53. package/examples/jsm/shaders/FXAAShader.js +0 -2
  54. package/examples/jsm/shaders/GTAOShader.js +1 -1
  55. package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
  56. package/examples/jsm/shaders/OutputShader.js +1 -1
  57. package/examples/jsm/transpiler/GLSLDecoder.js +46 -4
  58. package/examples/jsm/transpiler/TSLEncoder.js +24 -22
  59. package/examples/jsm/utils/TextureUtils.js +1 -1
  60. package/package.json +8 -6
  61. package/src/Three.WebGPU.js +200 -0
  62. package/src/Three.js +3 -0
  63. package/src/constants.js +4 -1
  64. package/src/core/Object3D.js +22 -22
  65. package/src/extras/Controls.js +32 -0
  66. package/src/extras/TextureUtils.js +210 -0
  67. package/src/lights/Light.js +1 -0
  68. package/src/lights/LightShadow.js +5 -0
  69. package/{examples/jsm/lights → src/lights/webgpu}/IESSpotLight.js +1 -1
  70. package/src/loaders/ObjectLoader.js +33 -2
  71. package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeLoader.js +6 -4
  72. package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeMaterialLoader.js +2 -2
  73. package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeObjectLoader.js +2 -1
  74. package/src/materials/Material.js +7 -1
  75. package/{examples/jsm/nodes/materials → src/materials/nodes}/InstancedPointsNodeMaterial.js +36 -27
  76. package/{examples/jsm/nodes/materials → src/materials/nodes}/Line2NodeMaterial.js +37 -40
  77. package/src/materials/nodes/LineBasicNodeMaterial.js +27 -0
  78. package/{examples/jsm/nodes/materials → src/materials/nodes}/LineDashedNodeMaterial.js +10 -11
  79. package/src/materials/nodes/MeshBasicNodeMaterial.js +73 -0
  80. package/src/materials/nodes/MeshLambertNodeMaterial.js +43 -0
  81. package/src/materials/nodes/MeshMatcapNodeMaterial.js +53 -0
  82. package/src/materials/nodes/MeshNormalNodeMaterial.js +40 -0
  83. package/src/materials/nodes/MeshPhongNodeMaterial.js +74 -0
  84. package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshPhysicalNodeMaterial.js +22 -20
  85. package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshSSSNodeMaterial.js +6 -6
  86. package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshStandardNodeMaterial.js +28 -11
  87. package/src/materials/nodes/MeshToonNodeMaterial.js +34 -0
  88. package/{examples/jsm/nodes/materials → src/materials/nodes}/NodeMaterial.js +142 -96
  89. package/{examples/jsm/nodes/materials/Materials.js → src/materials/nodes/NodeMaterials.js} +1 -1
  90. package/{examples/jsm/nodes/materials → src/materials/nodes}/PointsNodeMaterial.js +5 -6
  91. package/src/materials/nodes/ShadowNodeMaterial.js +34 -0
  92. package/{examples/jsm/nodes/materials → src/materials/nodes}/SpriteNodeMaterial.js +13 -13
  93. package/{examples/jsm/nodes/materials → src/materials/nodes}/VolumeNodeMaterial.js +14 -16
  94. package/src/math/Box2.js +4 -4
  95. package/src/math/Box3.js +6 -6
  96. package/src/math/ColorManagement.js +10 -0
  97. package/src/math/Matrix2.js +54 -0
  98. package/src/math/Vector4.js +13 -0
  99. package/src/nodes/Nodes.js +164 -0
  100. package/src/nodes/TSL.js +176 -0
  101. package/{examples/jsm → src}/nodes/accessors/AccessorsUtils.js +8 -8
  102. package/src/nodes/accessors/BatchNode.js +124 -0
  103. package/{examples/jsm/nodes/accessors/BitangentNode.js → src/nodes/accessors/Bitangent.js} +9 -9
  104. package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +41 -6
  105. package/{examples/jsm → src}/nodes/accessors/BufferNode.js +4 -4
  106. package/src/nodes/accessors/Camera.js +19 -0
  107. package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +16 -14
  108. package/src/nodes/accessors/CubeTextureNode.js +76 -0
  109. package/src/nodes/accessors/InstanceNode.js +144 -0
  110. package/src/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  111. package/{examples/jsm → src}/nodes/accessors/MaterialNode.js +66 -49
  112. package/src/nodes/accessors/MaterialProperties.js +3 -0
  113. package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +6 -4
  114. package/src/nodes/accessors/ModelNode.js +37 -0
  115. package/{examples/jsm → src}/nodes/accessors/ModelViewProjectionNode.js +6 -7
  116. package/{examples/jsm → src}/nodes/accessors/MorphNode.js +35 -31
  117. package/src/nodes/accessors/Normal.js +62 -0
  118. package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +11 -11
  119. package/src/nodes/accessors/PointUVNode.js +26 -0
  120. package/src/nodes/accessors/Position.js +10 -0
  121. package/src/nodes/accessors/ReferenceBaseNode.js +143 -0
  122. package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +14 -8
  123. package/src/nodes/accessors/ReflectVector.js +10 -0
  124. package/{examples/jsm → src}/nodes/accessors/RendererReferenceNode.js +6 -6
  125. package/{examples/jsm → src}/nodes/accessors/SceneNode.js +5 -6
  126. package/src/nodes/accessors/SkinningNode.js +187 -0
  127. package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +54 -6
  128. package/{examples/jsm → src}/nodes/accessors/StorageTextureNode.js +16 -7
  129. package/src/nodes/accessors/Tangent.js +22 -0
  130. package/{examples/jsm → src}/nodes/accessors/Texture3DNode.js +11 -11
  131. package/{examples/jsm/nodes/accessors/TextureBicubicNode.js → src/nodes/accessors/TextureBicubic.js} +3 -32
  132. package/{examples/jsm → src}/nodes/accessors/TextureNode.js +69 -37
  133. package/{examples/jsm → src}/nodes/accessors/TextureSizeNode.js +4 -6
  134. package/{examples/jsm/nodes/accessors/UniformsNode.js → src/nodes/accessors/UniformArrayNode.js} +24 -9
  135. package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +4 -4
  136. package/src/nodes/accessors/VelocityNode.js +83 -0
  137. package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +6 -5
  138. package/{examples/jsm → src}/nodes/code/CodeNode.js +5 -5
  139. package/{examples/jsm → src}/nodes/code/ExpressionNode.js +4 -4
  140. package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +5 -5
  141. package/{examples/jsm → src}/nodes/code/FunctionNode.js +5 -23
  142. package/{examples/jsm → src}/nodes/code/ScriptableNode.js +18 -6
  143. package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +6 -7
  144. package/{examples/jsm → src}/nodes/core/AssignNode.js +5 -5
  145. package/{examples/jsm → src}/nodes/core/AttributeNode.js +22 -21
  146. package/{examples/jsm → src}/nodes/core/BypassNode.js +5 -5
  147. package/src/nodes/core/CacheNode.js +46 -0
  148. package/{examples/jsm → src}/nodes/core/ConstNode.js +2 -2
  149. package/{examples/jsm → src}/nodes/core/ContextNode.js +17 -11
  150. package/{examples/jsm → src}/nodes/core/IndexNode.js +17 -6
  151. package/{examples/jsm → src}/nodes/core/InputNode.js +2 -2
  152. package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
  153. package/src/nodes/core/MRTNode.js +82 -0
  154. package/{examples/jsm → src}/nodes/core/Node.js +57 -31
  155. package/{examples/jsm → src}/nodes/core/NodeBuilder.js +216 -65
  156. package/src/nodes/core/NodeCache.js +36 -0
  157. package/{examples/jsm → src}/nodes/core/NodeFrame.js +42 -0
  158. package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
  159. package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
  160. package/{examples/jsm → src}/nodes/core/NodeUtils.js +7 -1
  161. package/{examples/jsm → src}/nodes/core/OutputStructNode.js +4 -4
  162. package/{examples/jsm → src}/nodes/core/ParameterNode.js +4 -4
  163. package/src/nodes/core/PropertyNode.js +84 -0
  164. package/{examples/jsm → src}/nodes/core/StackNode.js +26 -10
  165. package/{examples/jsm → src}/nodes/core/StructTypeNode.js +2 -2
  166. package/{examples/jsm → src}/nodes/core/TempNode.js +4 -4
  167. package/src/nodes/core/UniformGroupNode.js +55 -0
  168. package/{examples/jsm → src}/nodes/core/UniformNode.js +14 -5
  169. package/{examples/jsm → src}/nodes/core/VarNode.js +8 -12
  170. package/{examples/jsm → src}/nodes/core/VaryingNode.js +13 -5
  171. package/{examples/jsm → src}/nodes/display/AfterImageNode.js +27 -35
  172. package/src/nodes/display/AnaglyphPassNode.js +61 -0
  173. package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +27 -30
  174. package/src/nodes/display/BleachBypass.js +26 -0
  175. package/src/nodes/display/BlendMode.js +54 -0
  176. package/src/nodes/display/BloomNode.js +335 -0
  177. package/{examples/jsm → src}/nodes/display/BumpMapNode.js +7 -12
  178. package/src/nodes/display/ColorAdjustment.js +46 -0
  179. package/src/nodes/display/ColorSpaceFunctions.js +38 -0
  180. package/src/nodes/display/ColorSpaceNode.js +85 -0
  181. package/src/nodes/display/DenoiseNode.js +201 -0
  182. package/src/nodes/display/DepthOfFieldNode.js +121 -0
  183. package/src/nodes/display/DotScreenNode.js +63 -0
  184. package/src/nodes/display/FXAANode.js +329 -0
  185. package/src/nodes/display/FilmNode.js +53 -0
  186. package/src/nodes/display/FrontFacingNode.js +41 -0
  187. package/src/nodes/display/GTAONode.js +328 -0
  188. package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +44 -24
  189. package/src/nodes/display/Lut3DNode.js +54 -0
  190. package/src/nodes/display/MotionBlur.js +25 -0
  191. package/{examples/jsm → src}/nodes/display/NormalMapNode.js +9 -11
  192. package/src/nodes/display/ParallaxBarrierPassNode.js +55 -0
  193. package/src/nodes/display/PassNode.js +367 -0
  194. package/src/nodes/display/PixelationPassNode.js +206 -0
  195. package/{examples/jsm → src}/nodes/display/PosterizeNode.js +4 -6
  196. package/src/nodes/display/RGBShiftNode.js +50 -0
  197. package/src/nodes/display/RenderOutputNode.js +56 -0
  198. package/src/nodes/display/SSAAPassNode.js +284 -0
  199. package/src/nodes/display/Sepia.js +17 -0
  200. package/src/nodes/display/SobelOperatorNode.js +123 -0
  201. package/src/nodes/display/StereoCompositePassNode.js +107 -0
  202. package/src/nodes/display/StereoPassNode.js +80 -0
  203. package/src/nodes/display/ToneMappingFunctions.js +190 -0
  204. package/src/nodes/display/ToneMappingNode.js +66 -0
  205. package/src/nodes/display/TransitionNode.js +77 -0
  206. package/src/nodes/display/ViewportDepthNode.js +121 -0
  207. package/src/nodes/display/ViewportDepthTextureNode.js +30 -0
  208. package/{examples/jsm → src}/nodes/display/ViewportNode.js +28 -26
  209. package/src/nodes/display/ViewportSharedTextureNode.js +36 -0
  210. package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +12 -12
  211. package/{examples/jsm → src}/nodes/fog/FogExp2Node.js +4 -6
  212. package/{examples/jsm → src}/nodes/fog/FogNode.js +5 -7
  213. package/{examples/jsm → src}/nodes/fog/FogRangeNode.js +4 -6
  214. package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_GGX.js +4 -4
  215. package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  216. package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +6 -6
  217. package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +2 -2
  218. package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +2 -2
  219. package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX_Anisotropic.js +3 -3
  220. package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  221. package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +2 -2
  222. package/src/nodes/functions/BSDF/LTC.js +131 -0
  223. package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
  224. package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  225. package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  226. package/src/nodes/functions/BasicLightingModel.js +78 -0
  227. package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +10 -8
  228. package/{examples/jsm → src}/nodes/functions/PhysicalLightingModel.js +73 -31
  229. package/{examples/jsm → src}/nodes/functions/ShadowMaskModel.js +1 -1
  230. package/{examples/jsm → src}/nodes/functions/ToonLightingModel.js +6 -4
  231. package/src/nodes/functions/material/getGeometryRoughness.js +13 -0
  232. package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +2 -2
  233. package/{examples/jsm → src}/nodes/geometry/RangeNode.js +23 -10
  234. package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +5 -5
  235. package/src/nodes/lighting/AONode.js +24 -0
  236. package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +2 -7
  237. package/src/nodes/lighting/AnalyticLightNode.js +354 -0
  238. package/src/nodes/lighting/BasicEnvironmentNode.js +27 -0
  239. package/src/nodes/lighting/BasicLightMapNode.js +29 -0
  240. package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +3 -9
  241. package/{examples/jsm → src}/nodes/lighting/EnvironmentNode.js +23 -21
  242. package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +4 -7
  243. package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +3 -8
  244. package/{examples/jsm → src}/nodes/lighting/IrradianceNode.js +2 -2
  245. package/{examples/jsm → src}/nodes/lighting/LightNode.js +5 -5
  246. package/src/nodes/lighting/LightProbeNode.js +76 -0
  247. package/{examples/jsm → src}/nodes/lighting/LightUtils.js +3 -3
  248. package/src/nodes/lighting/LightingContextNode.js +64 -0
  249. package/{examples/jsm → src}/nodes/lighting/LightingNode.js +4 -2
  250. package/src/nodes/lighting/LightsNode.js +231 -0
  251. package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +4 -10
  252. package/src/nodes/lighting/RectAreaLightNode.js +93 -0
  253. package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +4 -10
  254. package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +2 -2
  255. package/{examples/jsm → src}/nodes/materialx/lib/mx_hsv.js +43 -46
  256. package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +500 -603
  257. package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +3 -9
  258. package/{examples/jsm/nodes/math/CondNode.js → src/nodes/math/ConditionalNode.js} +31 -13
  259. package/src/nodes/math/Hash.js +13 -0
  260. package/src/nodes/math/MathNode.js +404 -0
  261. package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -7
  262. package/{examples/jsm → src}/nodes/math/OperatorNode.js +100 -58
  263. package/{examples/jsm → src}/nodes/math/TriNoise3D.js +19 -29
  264. package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
  265. package/{examples/jsm → src}/nodes/pmrem/PMREMNode.js +60 -16
  266. package/{examples/jsm → src}/nodes/pmrem/PMREMUtils.js +46 -46
  267. package/src/nodes/procedural/Checker.js +14 -0
  268. package/src/nodes/tsl/TSLBase.js +30 -0
  269. package/{examples/jsm/nodes/shadernode/ShaderNode.js → src/nodes/tsl/TSLCore.js} +106 -96
  270. package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +2 -2
  271. package/{examples/jsm → src}/nodes/utils/ConvertNode.js +2 -2
  272. package/src/nodes/utils/CubeMapNode.js +157 -0
  273. package/src/nodes/utils/Discard.js +8 -0
  274. package/{examples/jsm → src}/nodes/utils/EquirectUVNode.js +5 -5
  275. package/src/nodes/utils/FlipNode.js +65 -0
  276. package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +7 -5
  277. package/{examples/jsm → src}/nodes/utils/JoinNode.js +2 -2
  278. package/{examples/jsm → src}/nodes/utils/LoopNode.js +19 -12
  279. package/{examples/jsm → src}/nodes/utils/MatcapUVNode.js +6 -6
  280. package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +12 -6
  281. package/{examples/jsm → src}/nodes/utils/OscNode.js +7 -7
  282. package/src/nodes/utils/Packing.js +4 -0
  283. package/src/nodes/utils/RTTNode.js +130 -0
  284. package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +17 -4
  285. package/{examples/jsm → src}/nodes/utils/RemapNode.js +7 -7
  286. package/{examples/jsm → src}/nodes/utils/RotateNode.js +4 -12
  287. package/{examples/jsm → src}/nodes/utils/SetNode.js +2 -2
  288. package/{examples/jsm → src}/nodes/utils/SplitNode.js +2 -2
  289. package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +5 -5
  290. package/src/nodes/utils/SpriteUtils.js +47 -0
  291. package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +4 -6
  292. package/{examples/jsm → src}/nodes/utils/TimerNode.js +5 -5
  293. package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +7 -9
  294. package/src/nodes/utils/UVUtils.js +19 -0
  295. package/src/nodes/utils/ViewportUtils.js +14 -0
  296. package/src/objects/BatchedMesh.js +169 -190
  297. package/src/objects/InstancedMesh.js +1 -1
  298. package/src/renderers/WebGLRenderer.js +60 -23
  299. package/{examples/jsm → src}/renderers/common/Attributes.js +2 -1
  300. package/{examples/jsm → src}/renderers/common/Backend.js +30 -27
  301. package/{examples/jsm → src}/renderers/common/Background.js +12 -4
  302. package/src/renderers/common/BindGroup.js +18 -0
  303. package/{examples/jsm → src}/renderers/common/Bindings.js +45 -32
  304. package/{examples/jsm → src}/renderers/common/ClippingContext.js +18 -7
  305. package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
  306. package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +16 -4
  307. package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
  308. package/{examples/jsm → src}/renderers/common/Info.js +34 -6
  309. package/src/renderers/common/PostProcessing.js +90 -0
  310. package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +8 -3
  311. package/{examples/jsm → src}/renderers/common/RenderContext.js +25 -1
  312. package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
  313. package/{examples/jsm → src}/renderers/common/RenderList.js +1 -1
  314. package/{examples/jsm → src}/renderers/common/RenderObject.js +45 -12
  315. package/{examples/jsm → src}/renderers/common/Renderer.js +151 -73
  316. package/{examples/jsm → src}/renderers/common/SampledTexture.js +14 -5
  317. package/src/renderers/common/StandardRenderer.js +18 -0
  318. package/{examples/jsm → src}/renderers/common/StorageBufferAttribute.js +1 -1
  319. package/{examples/jsm → src}/renderers/common/StorageInstancedBufferAttribute.js +1 -1
  320. package/{examples/jsm → src}/renderers/common/StorageTexture.js +2 -1
  321. package/{examples/jsm → src}/renderers/common/Textures.js +14 -14
  322. package/{examples/jsm → src}/renderers/common/Uniform.js +9 -4
  323. package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
  324. package/{examples/jsm → src}/renderers/common/extras/PMREMGenerator.js +25 -25
  325. package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
  326. package/src/renderers/common/nodes/NodeLibrary.js +118 -0
  327. package/{examples/jsm → src}/renderers/common/nodes/NodeSampledTexture.js +8 -7
  328. package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +2 -1
  329. package/{examples/jsm → src}/renderers/common/nodes/NodeStorageBuffer.js +5 -1
  330. package/{examples/jsm → src}/renderers/common/nodes/NodeUniform.js +3 -3
  331. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformBuffer.js +2 -1
  332. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformsGroup.js +2 -8
  333. package/{examples/jsm → src}/renderers/common/nodes/Nodes.js +69 -21
  334. package/src/renderers/common/nodes/StandardNodeLibrary.js +105 -0
  335. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +16 -1
  336. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
  337. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +1 -1
  338. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +0 -9
  339. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -10
  340. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
  341. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +45 -13
  342. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -4
  343. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +3 -0
  344. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +3 -3
  345. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +2 -2
  346. package/src/renderers/shaders/ShaderLib/depth.glsl.js +8 -0
  347. package/src/renderers/shaders/UniformsLib.js +3 -0
  348. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  349. package/src/renderers/webgl/WebGLBufferRenderer.js +6 -19
  350. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +6 -18
  351. package/src/renderers/webgl/WebGLLights.js +6 -0
  352. package/src/renderers/webgl/WebGLProgram.js +27 -1
  353. package/src/renderers/webgl/WebGLPrograms.js +1 -1
  354. package/src/renderers/webgl/WebGLProperties.js +7 -0
  355. package/src/renderers/webgl/WebGLTextures.js +75 -57
  356. package/src/renderers/webgl/WebGLUniforms.js +12 -2
  357. package/src/renderers/webgl/WebGLUniformsGroups.js +7 -7
  358. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +242 -120
  359. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +227 -44
  360. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +2 -2
  361. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +1 -0
  362. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLExtensions.js +2 -0
  363. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLState.js +22 -1
  364. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +62 -23
  365. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
  366. package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +242 -136
  367. package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +9 -9
  368. package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +281 -107
  369. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
  370. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  371. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +64 -33
  372. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +4 -1
  373. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +34 -36
  374. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +62 -5
  375. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +76 -44
  376. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +42 -4
  377. package/src/renderers/webxr/WebXRDepthSensing.js +6 -0
  378. package/src/renderers/webxr/WebXRManager.js +37 -24
  379. package/src/textures/CompressedArrayTexture.js +1 -1
  380. package/examples/jsm/loaders/LogLuvLoader.js +0 -606
  381. package/examples/jsm/nodes/Nodes.js +0 -202
  382. package/examples/jsm/nodes/accessors/BatchNode.js +0 -78
  383. package/examples/jsm/nodes/accessors/CameraNode.js +0 -12
  384. package/examples/jsm/nodes/accessors/CubeTextureNode.js +0 -61
  385. package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
  386. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +0 -21
  387. package/examples/jsm/nodes/accessors/ModelNode.js +0 -36
  388. package/examples/jsm/nodes/accessors/NormalNode.js +0 -14
  389. package/examples/jsm/nodes/accessors/PointUVNode.js +0 -26
  390. package/examples/jsm/nodes/accessors/PositionNode.js +0 -10
  391. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +0 -6
  392. package/examples/jsm/nodes/accessors/SkinningNode.js +0 -124
  393. package/examples/jsm/nodes/accessors/TangentNode.js +0 -23
  394. package/examples/jsm/nodes/core/CacheNode.js +0 -49
  395. package/examples/jsm/nodes/core/NodeCache.js +0 -26
  396. package/examples/jsm/nodes/core/NodeKeywords.js +0 -80
  397. package/examples/jsm/nodes/core/PropertyNode.js +0 -83
  398. package/examples/jsm/nodes/core/UniformGroupNode.js +0 -36
  399. package/examples/jsm/nodes/display/BlendModeNode.js +0 -128
  400. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +0 -99
  401. package/examples/jsm/nodes/display/ColorSpaceNode.js +0 -108
  402. package/examples/jsm/nodes/display/FrontFacingNode.js +0 -40
  403. package/examples/jsm/nodes/display/PassNode.js +0 -201
  404. package/examples/jsm/nodes/display/ToneMappingNode.js +0 -188
  405. package/examples/jsm/nodes/display/ViewportDepthNode.js +0 -97
  406. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +0 -31
  407. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +0 -37
  408. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +0 -13
  409. package/examples/jsm/nodes/lighting/AONode.js +0 -27
  410. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -256
  411. package/examples/jsm/nodes/lighting/LightingContextNode.js +0 -66
  412. package/examples/jsm/nodes/lighting/LightsNode.js +0 -215
  413. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -28
  414. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
  415. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +0 -34
  416. package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +0 -52
  417. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -38
  418. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -65
  419. package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +0 -34
  420. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +0 -34
  421. package/examples/jsm/nodes/math/HashNode.js +0 -34
  422. package/examples/jsm/nodes/math/MathNode.js +0 -391
  423. package/examples/jsm/nodes/procedural/CheckerNode.js +0 -42
  424. package/examples/jsm/nodes/utils/DiscardNode.js +0 -27
  425. package/examples/jsm/nodes/utils/PackingNode.js +0 -55
  426. package/examples/jsm/nodes/utils/RotateUVNode.js +0 -35
  427. package/examples/jsm/renderers/common/PostProcessing.js +0 -33
  428. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
  429. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
  430. /package/{examples/jsm/nodes/accessors/UVNode.js → src/nodes/accessors/UV.js} +0 -0
  431. /package/{examples/jsm → src}/nodes/core/NodeAttribute.js +0 -0
  432. /package/{examples/jsm → src}/nodes/core/NodeCode.js +0 -0
  433. /package/{examples/jsm → src}/nodes/core/NodeFunctionInput.js +0 -0
  434. /package/{examples/jsm → src}/nodes/core/NodeParser.js +0 -0
  435. /package/{examples/jsm → src}/nodes/core/NodeVar.js +0 -0
  436. /package/{examples/jsm → src}/nodes/core/NodeVarying.js +0 -0
  437. /package/{examples/jsm → src}/nodes/core/UniformGroup.js +0 -0
  438. /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
  439. /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
  440. /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
  441. /package/{examples/jsm → src}/renderers/common/Animation.js +0 -0
  442. /package/{examples/jsm → src}/renderers/common/Binding.js +0 -0
  443. /package/{examples/jsm → src}/renderers/common/Buffer.js +0 -0
  444. /package/{examples/jsm → src}/renderers/common/BufferUtils.js +0 -0
  445. /package/{examples/jsm → src}/renderers/common/ChainMap.js +0 -0
  446. /package/{examples/jsm → src}/renderers/common/ComputePipeline.js +0 -0
  447. /package/{examples/jsm → src}/renderers/common/Constants.js +0 -0
  448. /package/{examples/jsm → src}/renderers/common/DataMap.js +0 -0
  449. /package/{examples/jsm → src}/renderers/common/Pipeline.js +0 -0
  450. /package/{examples/jsm → src}/renderers/common/Pipelines.js +0 -0
  451. /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
  452. /package/{examples/jsm → src}/renderers/common/RenderBundle.js +0 -0
  453. /package/{examples/jsm → src}/renderers/common/RenderBundles.js +0 -0
  454. /package/{examples/jsm → src}/renderers/common/RenderLists.js +0 -0
  455. /package/{examples/jsm → src}/renderers/common/RenderObjects.js +0 -0
  456. /package/{examples/jsm → src}/renderers/common/RenderPipeline.js +0 -0
  457. /package/{examples/jsm → src}/renderers/common/Sampler.js +0 -0
  458. /package/{examples/jsm → src}/renderers/common/StorageBuffer.js +0 -0
  459. /package/{examples/jsm → src}/renderers/common/UniformBuffer.js +0 -0
  460. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBufferRenderer.js +0 -0
  461. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLCapabilities.js +0 -0
  462. /package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeParser.js +0 -0
@@ -2,9 +2,7 @@
2
2
  import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js';
3
3
  //*/
4
4
 
5
- import { WebGPUCoordinateSystem } from 'three';
6
-
7
- import { GPUFeatureName, GPUTextureFormat, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension } from './utils/WebGPUConstants.js';
5
+ import { GPUFeatureName, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension } from './utils/WebGPUConstants.js';
8
6
 
9
7
  import WGSLNodeBuilder from './nodes/WGSLNodeBuilder.js';
10
8
  import Backend from '../common/Backend.js';
@@ -15,6 +13,8 @@ import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
15
13
  import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
16
14
  import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
17
15
 
16
+ import { WebGPUCoordinateSystem } from '../../constants.js';
17
+
18
18
  //
19
19
 
20
20
  class WebGPUBackend extends Backend {
@@ -28,18 +28,6 @@ class WebGPUBackend extends Backend {
28
28
  // some parameters require default values other than "undefined"
29
29
  this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha;
30
30
 
31
- this.parameters.antialias = ( parameters.antialias === true );
32
-
33
- if ( this.parameters.antialias === true ) {
34
-
35
- this.parameters.sampleCount = ( parameters.sampleCount === undefined ) ? 4 : parameters.sampleCount;
36
-
37
- } else {
38
-
39
- this.parameters.sampleCount = 1;
40
-
41
- }
42
-
43
31
  this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
44
32
 
45
33
  this.trackTimestamp = ( parameters.trackTimestamp === true );
@@ -120,9 +108,11 @@ class WebGPUBackend extends Backend {
120
108
 
121
109
  const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
122
110
 
111
+ this.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery );
112
+
123
113
  this.context.configure( {
124
114
  device: this.device,
125
- format: GPUTextureFormat.BGRA8Unorm,
115
+ format: this.utils.getPreferredCanvasFormat(),
126
116
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
127
117
  alphaMode: alphaMode
128
118
  } );
@@ -153,8 +143,6 @@ class WebGPUBackend extends Backend {
153
143
 
154
144
  let descriptor = this.defaultRenderPassdescriptor;
155
145
 
156
- const antialias = this.parameters.antialias;
157
-
158
146
  if ( descriptor === null ) {
159
147
 
160
148
  const renderer = this.renderer;
@@ -170,7 +158,7 @@ class WebGPUBackend extends Backend {
170
158
 
171
159
  const colorAttachment = descriptor.colorAttachments[ 0 ];
172
160
 
173
- if ( antialias === true ) {
161
+ if ( this.renderer.samples > 0 ) {
174
162
 
175
163
  colorAttachment.view = this.colorBuffer.createView();
176
164
 
@@ -186,7 +174,7 @@ class WebGPUBackend extends Backend {
186
174
 
187
175
  const colorAttachment = descriptor.colorAttachments[ 0 ];
188
176
 
189
- if ( antialias === true ) {
177
+ if ( this.renderer.samples > 0 ) {
190
178
 
191
179
  colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
192
180
 
@@ -207,25 +195,34 @@ class WebGPUBackend extends Backend {
207
195
 
208
196
  let descriptors = renderTargetData.descriptors;
209
197
 
210
- if ( descriptors === undefined ) {
198
+ if ( descriptors === undefined ||
199
+ renderTargetData.width !== renderTarget.width ||
200
+ renderTargetData.height !== renderTarget.height ||
201
+ renderTargetData.activeMipmapLevel !== renderTarget.activeMipmapLevel ||
202
+ renderTargetData.samples !== renderTarget.samples
203
+ ) {
211
204
 
212
- descriptors = [];
205
+ descriptors = {};
213
206
 
214
207
  renderTargetData.descriptors = descriptors;
215
208
 
216
- }
209
+ // dispose
217
210
 
218
- if ( renderTargetData.width !== renderTarget.width ||
219
- renderTargetData.height !== renderTarget.height ||
220
- renderTargetData.activeMipmapLevel !== renderTarget.activeMipmapLevel ||
221
- renderTargetData.samples !== renderTarget.samples
222
- ) {
211
+ const onDispose = () => {
212
+
213
+ renderTarget.removeEventListener( 'dispose', onDispose );
223
214
 
224
- descriptors.length = 0;
215
+ this.delete( renderTarget );
216
+
217
+ };
218
+
219
+ renderTarget.addEventListener( 'dispose', onDispose );
225
220
 
226
221
  }
227
222
 
228
- let descriptor = descriptors[ renderContext.activeCubeFace ];
223
+ const cacheKey = renderContext.getCacheKey();
224
+
225
+ let descriptor = descriptors[ cacheKey ];
229
226
 
230
227
  if ( descriptor === undefined ) {
231
228
 
@@ -269,7 +266,7 @@ class WebGPUBackend extends Backend {
269
266
  const depthTextureData = this.get( renderContext.depthTexture );
270
267
 
271
268
  const depthStencilAttachment = {
272
- view: depthTextureData.texture.createView(),
269
+ view: depthTextureData.texture.createView()
273
270
  };
274
271
 
275
272
  descriptor = {
@@ -277,7 +274,7 @@ class WebGPUBackend extends Backend {
277
274
  depthStencilAttachment
278
275
  };
279
276
 
280
- descriptors[ renderContext.activeCubeFace ] = descriptor;
277
+ descriptors[ cacheKey ] = descriptor;
281
278
 
282
279
  renderTargetData.width = renderTarget.width;
283
280
  renderTargetData.height = renderTarget.height;
@@ -350,7 +347,7 @@ class WebGPUBackend extends Backend {
350
347
 
351
348
  if ( renderContext.clearColor ) {
352
349
 
353
- colorAttachment.clearValue = renderContext.clearColorValue;
350
+ colorAttachment.clearValue = i === 0 ? renderContext.clearColorValue : { r: 0, g: 0, b: 0, a: 1 };
354
351
  colorAttachment.loadOp = GPULoadOp.Clear;
355
352
  colorAttachment.storeOp = GPUStoreOp.Store;
356
353
 
@@ -428,7 +425,8 @@ class WebGPUBackend extends Backend {
428
425
  renderContextData.descriptor = descriptor;
429
426
  renderContextData.encoder = encoder;
430
427
  renderContextData.currentPass = currentPass;
431
- renderContextData.currentSets = { attributes: {} };
428
+ renderContextData.currentSets = { attributes: {}, pipeline: null, index: null };
429
+ renderContextData.renderBundles = [];
432
430
 
433
431
  //
434
432
 
@@ -442,7 +440,7 @@ class WebGPUBackend extends Backend {
442
440
 
443
441
  const { x, y, width, height } = renderContext.scissorValue;
444
442
 
445
- currentPass.setScissorRect( x, renderContext.height - height - y, width, height );
443
+ currentPass.setScissorRect( x, y, width, height );
446
444
 
447
445
  }
448
446
 
@@ -453,9 +451,8 @@ class WebGPUBackend extends Backend {
453
451
  const renderContextData = this.get( renderContext );
454
452
  const occlusionQueryCount = renderContext.occlusionQueryCount;
455
453
 
456
- if ( renderContextData.renderBundles !== undefined && renderContextData.renderBundles.length > 0 ) {
454
+ if ( renderContextData.renderBundles.length > 0 ) {
457
455
 
458
- renderContextData.registerBundlesPhase = false;
459
456
  renderContextData.currentPass.executeBundles( renderContextData.renderBundles );
460
457
 
461
458
  }
@@ -567,7 +564,7 @@ class WebGPUBackend extends Backend {
567
564
 
568
565
  for ( let i = 0; i < currentOcclusionQueryObjects.length; i ++ ) {
569
566
 
570
- if ( results[ i ] !== 0n ) {
567
+ if ( results[ i ] !== BigInt( 0 ) ) {
571
568
 
572
569
  occluded.add( currentOcclusionQueryObjects[ i ] );
573
570
 
@@ -588,7 +585,7 @@ class WebGPUBackend extends Backend {
588
585
  const { currentPass } = this.get( renderContext );
589
586
  const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
590
587
 
591
- currentPass.setViewport( x, renderContext.height - height - y, width, height, minDepth, maxDepth );
588
+ currentPass.setViewport( x, y, width, height, minDepth, maxDepth );
592
589
 
593
590
  }
594
591
 
@@ -609,7 +606,19 @@ class WebGPUBackend extends Backend {
609
606
 
610
607
  const clearColor = this.getClearColor();
611
608
 
612
- clearValue = { r: clearColor.r, g: clearColor.g, b: clearColor.b, a: clearColor.a };
609
+ if ( this.renderer.alpha === true ) {
610
+
611
+ // premultiply alpha
612
+
613
+ const a = clearColor.a;
614
+
615
+ clearValue = { r: clearColor.r * a, g: clearColor.g * a, b: clearColor.b * a, a: a };
616
+
617
+ } else {
618
+
619
+ clearValue = { r: clearColor.r, g: clearColor.g, b: clearColor.b, a: clearColor.a };
620
+
621
+ }
613
622
 
614
623
  }
615
624
 
@@ -766,12 +775,41 @@ class WebGPUBackend extends Backend {
766
775
  const pipelineGPU = this.get( pipeline ).pipeline;
767
776
  passEncoderGPU.setPipeline( pipelineGPU );
768
777
 
769
- // bind group
778
+ // bind groups
770
779
 
771
- const bindGroupGPU = this.get( bindings ).group;
772
- passEncoderGPU.setBindGroup( 0, bindGroupGPU );
780
+ for ( let i = 0, l = bindings.length; i < l; i ++ ) {
773
781
 
774
- passEncoderGPU.dispatchWorkgroups( computeNode.dispatchCount );
782
+ const bindGroup = bindings[ i ];
783
+ const bindingsData = this.get( bindGroup );
784
+
785
+ passEncoderGPU.setBindGroup( i, bindingsData.group );
786
+
787
+ }
788
+
789
+ const maxComputeWorkgroupsPerDimension = this.device.limits.maxComputeWorkgroupsPerDimension;
790
+
791
+ const computeNodeData = this.get( computeNode );
792
+
793
+ if ( computeNodeData.dispatchSize === undefined ) computeNodeData.dispatchSize = { x: 0, y: 1, z: 1 };
794
+
795
+ const { dispatchSize } = computeNodeData;
796
+
797
+ if ( computeNode.dispatchCount > maxComputeWorkgroupsPerDimension ) {
798
+
799
+ dispatchSize.x = Math.min( computeNode.dispatchCount, maxComputeWorkgroupsPerDimension );
800
+ dispatchSize.y = Math.ceil( computeNode.dispatchCount / maxComputeWorkgroupsPerDimension );
801
+
802
+ } else {
803
+
804
+ dispatchSize.x = computeNode.dispatchCount;
805
+
806
+ }
807
+
808
+ passEncoderGPU.dispatchWorkgroups(
809
+ dispatchSize.x,
810
+ dispatchSize.y,
811
+ dispatchSize.z
812
+ );
775
813
 
776
814
  }
777
815
 
@@ -792,26 +830,11 @@ class WebGPUBackend extends Backend {
792
830
  draw( renderObject, info ) {
793
831
 
794
832
  const { object, geometry, context, pipeline } = renderObject;
795
-
796
- const bindingsData = this.get( renderObject.getBindings() );
797
- const contextData = this.get( context );
798
- const pipelineGPU = this.get( pipeline ).pipeline;
799
- const currentSets = contextData.currentSets;
800
-
801
- const renderObjectData = this.get( renderObject );
802
-
803
- const { bundleEncoder, renderBundle, lastPipelineGPU } = renderObjectData;
804
-
833
+ const bindings = renderObject.getBindings();
805
834
  const renderContextData = this.get( context );
806
-
807
- if ( renderContextData.registerBundlesPhase === true && bundleEncoder !== undefined && lastPipelineGPU === pipelineGPU ) {
808
-
809
- renderContextData.renderBundles.push( renderBundle );
810
- return;
811
-
812
- }
813
-
814
- const passEncoderGPU = this.renderer._currentRenderBundle ? this.createBundleEncoder( context, renderObject ) : contextData.currentPass;
835
+ const pipelineGPU = this.get( pipeline ).pipeline;
836
+ const currentSets = renderContextData.currentSets;
837
+ const passEncoderGPU = renderContextData.currentPass;
815
838
 
816
839
  // pipeline
817
840
 
@@ -823,10 +846,16 @@ class WebGPUBackend extends Backend {
823
846
 
824
847
  }
825
848
 
826
- // bind group
849
+ // bind groups
850
+
851
+ for ( let i = 0, l = bindings.length; i < l; i ++ ) {
852
+
853
+ const bindGroup = bindings[ i ];
854
+ const bindingsData = this.get( bindGroup );
827
855
 
828
- const bindGroupGPU = bindingsData.group;
829
- passEncoderGPU.setBindGroup( 0, bindGroupGPU );
856
+ passEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group );
857
+
858
+ }
830
859
 
831
860
  // attributes
832
861
 
@@ -872,27 +901,27 @@ class WebGPUBackend extends Backend {
872
901
 
873
902
  // occlusion queries - handle multiple consecutive draw calls for an object
874
903
 
875
- if ( contextData.occlusionQuerySet !== undefined ) {
904
+ if ( renderContextData.occlusionQuerySet !== undefined ) {
876
905
 
877
- const lastObject = contextData.lastOcclusionObject;
906
+ const lastObject = renderContextData.lastOcclusionObject;
878
907
 
879
908
  if ( lastObject !== object ) {
880
909
 
881
910
  if ( lastObject !== null && lastObject.occlusionTest === true ) {
882
911
 
883
912
  passEncoderGPU.endOcclusionQuery();
884
- contextData.occlusionQueryIndex ++;
913
+ renderContextData.occlusionQueryIndex ++;
885
914
 
886
915
  }
887
916
 
888
917
  if ( object.occlusionTest === true ) {
889
918
 
890
- passEncoderGPU.beginOcclusionQuery( contextData.occlusionQueryIndex );
891
- contextData.occlusionQueryObjects[ contextData.occlusionQueryIndex ] = object;
919
+ passEncoderGPU.beginOcclusionQuery( renderContextData.occlusionQueryIndex );
920
+ renderContextData.occlusionQueryObjects[ renderContextData.occlusionQueryIndex ] = object;
892
921
 
893
922
  }
894
923
 
895
- contextData.lastOcclusionObject = object;
924
+ renderContextData.lastOcclusionObject = object;
896
925
 
897
926
  }
898
927
 
@@ -906,7 +935,25 @@ class WebGPUBackend extends Backend {
906
935
  const instanceCount = this.getInstanceCount( renderObject );
907
936
  if ( instanceCount === 0 ) return;
908
937
 
909
- if ( hasIndex === true ) {
938
+ if ( object.isBatchedMesh === true ) {
939
+
940
+ const starts = object._multiDrawStarts;
941
+ const counts = object._multiDrawCounts;
942
+ const drawCount = object._multiDrawCount;
943
+ const drawInstances = object._multiDrawInstances;
944
+
945
+ const bytesPerElement = hasIndex ? index.array.BYTES_PER_ELEMENT : 1;
946
+
947
+ for ( let i = 0; i < drawCount; i ++ ) {
948
+
949
+ const count = drawInstances ? drawInstances[ i ] : 1;
950
+ const firstInstance = count > 1 ? 0 : i;
951
+
952
+ passEncoderGPU.drawIndexed( counts[ i ], count, starts[ i ] / bytesPerElement, 0, firstInstance );
953
+
954
+ }
955
+
956
+ } else if ( hasIndex === true ) {
910
957
 
911
958
  const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
912
959
 
@@ -925,16 +972,6 @@ class WebGPUBackend extends Backend {
925
972
 
926
973
  }
927
974
 
928
-
929
- if ( this.renderer._currentRenderBundle ) {
930
-
931
- const renderBundle = passEncoderGPU.finish();
932
- renderObjectData.lastPipelineGPU = pipelineGPU;
933
- renderObjectData.renderBundle = renderBundle;
934
- renderObjectData.bundleEncoder = passEncoderGPU;
935
-
936
- }
937
-
938
975
  }
939
976
 
940
977
  // cache key
@@ -947,7 +984,7 @@ class WebGPUBackend extends Backend {
947
984
 
948
985
  const utils = this.utils;
949
986
 
950
- const sampleCount = utils.getSampleCount( renderObject.context );
987
+ const sampleCount = utils.getSampleCountRenderContext( renderObject.context );
951
988
  const colorSpace = utils.getCurrentColorSpace( renderObject.context );
952
989
  const colorFormat = utils.getCurrentColorFormat( renderObject.context );
953
990
  const depthStencilFormat = utils.getCurrentDepthStencilFormat( renderObject.context );
@@ -967,7 +1004,7 @@ class WebGPUBackend extends Backend {
967
1004
  data.sampleCount !== sampleCount || data.colorSpace !== colorSpace ||
968
1005
  data.colorFormat !== colorFormat || data.depthStencilFormat !== depthStencilFormat ||
969
1006
  data.primitiveTopology !== primitiveTopology ||
970
- data.clippingContextVersion !== renderObject.clippingContextVersion
1007
+ data.clippingContextCacheKey !== renderObject.clippingContext.cacheKey
971
1008
  ) {
972
1009
 
973
1010
  data.material = material; data.materialVersion = material.version;
@@ -985,7 +1022,7 @@ class WebGPUBackend extends Backend {
985
1022
  data.colorFormat = colorFormat;
986
1023
  data.depthStencilFormat = depthStencilFormat;
987
1024
  data.primitiveTopology = primitiveTopology;
988
- data.clippingContextVersion = renderObject.clippingContextVersion;
1025
+ data.clippingContextCacheKey = renderObject.clippingContext.cacheKey;
989
1026
 
990
1027
  needsUpdate = true;
991
1028
 
@@ -1012,14 +1049,15 @@ class WebGPUBackend extends Backend {
1012
1049
  material.stencilFail, material.stencilZFail, material.stencilZPass,
1013
1050
  material.stencilFuncMask, material.stencilWriteMask,
1014
1051
  material.side,
1015
- utils.getSampleCount( renderContext ),
1052
+ utils.getSampleCountRenderContext( renderContext ),
1016
1053
  utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ),
1017
1054
  utils.getPrimitiveTopology( object, material ),
1018
- renderObject.clippingContextVersion
1055
+ renderObject.clippingContext.cacheKey
1019
1056
  ].join();
1020
1057
 
1021
1058
  }
1022
1059
 
1060
+
1023
1061
  // textures
1024
1062
 
1025
1063
  createSampler( texture ) {
@@ -1073,7 +1111,7 @@ class WebGPUBackend extends Backend {
1073
1111
 
1074
1112
  initTimestampQuery( renderContext, descriptor ) {
1075
1113
 
1076
- if ( ! this.hasFeature( GPUFeatureName.TimestampQuery ) || ! this.trackTimestamp ) return;
1114
+ if ( ! this.trackTimestamp ) return;
1077
1115
 
1078
1116
  const renderContextData = this.get( renderContext );
1079
1117
 
@@ -1103,57 +1141,75 @@ class WebGPUBackend extends Backend {
1103
1141
 
1104
1142
  prepareTimestampBuffer( renderContext, encoder ) {
1105
1143
 
1106
- if ( ! this.hasFeature( GPUFeatureName.TimestampQuery ) || ! this.trackTimestamp ) return;
1144
+ if ( ! this.trackTimestamp ) return;
1107
1145
 
1108
1146
  const renderContextData = this.get( renderContext );
1109
1147
 
1148
+
1110
1149
  const size = 2 * BigInt64Array.BYTES_PER_ELEMENT;
1111
- const resolveBuffer = this.device.createBuffer( {
1112
- size,
1113
- usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC,
1114
- } );
1115
1150
 
1116
- const resultBuffer = this.device.createBuffer( {
1117
- size,
1118
- usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
1119
- } );
1151
+ if ( renderContextData.currentTimestampQueryBuffers === undefined ) {
1152
+
1153
+ renderContextData.currentTimestampQueryBuffers = {
1154
+ resolveBuffer: this.device.createBuffer( {
1155
+ label: 'timestamp resolve buffer',
1156
+ size: size,
1157
+ usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC,
1158
+ } ),
1159
+ resultBuffer: this.device.createBuffer( {
1160
+ label: 'timestamp result buffer',
1161
+ size: size,
1162
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
1163
+ } ),
1164
+ isMappingPending: false,
1165
+ };
1166
+
1167
+ }
1168
+
1169
+ const { resolveBuffer, resultBuffer, isMappingPending } = renderContextData.currentTimestampQueryBuffers;
1170
+
1171
+ if ( isMappingPending === true ) return;
1120
1172
 
1121
1173
  encoder.resolveQuerySet( renderContextData.timeStampQuerySet, 0, 2, resolveBuffer, 0 );
1122
1174
  encoder.copyBufferToBuffer( resolveBuffer, 0, resultBuffer, 0, size );
1123
1175
 
1124
- renderContextData.currentTimestampQueryBuffer = resultBuffer;
1125
-
1126
1176
  }
1127
1177
 
1128
- async resolveTimestampAsync(renderContext, type = 'render') {
1129
- if (!this.hasFeature(GPUFeatureName.TimestampQuery) || !this.trackTimestamp) return;
1130
-
1131
- const renderContextData = this.get(renderContext);
1132
- const { currentTimestampQueryBuffer } = renderContextData;
1133
-
1134
- if (currentTimestampQueryBuffer === undefined) return;
1135
-
1136
- const buffer = currentTimestampQueryBuffer;
1137
-
1138
- try {
1139
- await buffer.mapAsync(GPUMapMode.READ);
1140
- const times = new BigUint64Array(buffer.getMappedRange());
1141
- const duration = Number(times[1] - times[0]) / 1000000;
1142
- this.renderer.info.updateTimestamp(type, duration);
1143
- } catch (error) {
1144
- console.error(`Error mapping buffer: ${error}`);
1145
- // Optionally handle the error, e.g., re-queue the buffer or skip it
1146
- } finally {
1147
- buffer.unmap();
1148
- }
1178
+ async resolveTimestampAsync( renderContext, type = 'render' ) {
1179
+
1180
+ if ( ! this.trackTimestamp ) return;
1181
+
1182
+ const renderContextData = this.get( renderContext );
1183
+
1184
+ if ( renderContextData.currentTimestampQueryBuffers === undefined ) return;
1185
+
1186
+ const { resultBuffer, isMappingPending } = renderContextData.currentTimestampQueryBuffers;
1187
+
1188
+ if ( isMappingPending === true ) return;
1189
+
1190
+ renderContextData.currentTimestampQueryBuffers.isMappingPending = true;
1191
+
1192
+ resultBuffer.mapAsync( GPUMapMode.READ ).then( () => {
1193
+
1194
+ const times = new BigUint64Array( resultBuffer.getMappedRange() );
1195
+ const duration = Number( times[ 1 ] - times[ 0 ] ) / 1000000;
1196
+
1197
+
1198
+ this.renderer.info.updateTimestamp( type, duration );
1199
+
1200
+ resultBuffer.unmap();
1201
+
1202
+ renderContextData.currentTimestampQueryBuffers.isMappingPending = false;
1203
+
1204
+ } );
1205
+
1149
1206
  }
1150
-
1151
1207
 
1152
1208
  // node builder
1153
1209
 
1154
- createNodeBuilder( object, renderer, scene = null ) {
1210
+ createNodeBuilder( object, renderer ) {
1155
1211
 
1156
- return new WGSLNodeBuilder( object, renderer, scene );
1212
+ return new WGSLNodeBuilder( object, renderer );
1157
1213
 
1158
1214
  }
1159
1215
 
@@ -1190,23 +1246,53 @@ class WebGPUBackend extends Backend {
1190
1246
 
1191
1247
  }
1192
1248
 
1193
- createBundleEncoder( renderContext, renderObject ) {
1249
+ beginBundle( renderContext ) {
1250
+
1251
+ const renderContextData = this.get( renderContext );
1252
+
1253
+ renderContextData._currentPass = renderContextData.currentPass;
1254
+ renderContextData._currentSets = renderContextData.currentSets;
1255
+
1256
+ renderContextData.currentSets = { attributes: {}, pipeline: null, index: null };
1257
+ renderContextData.currentPass = this.pipelineUtils.createBundleEncoder( renderContext );
1258
+
1259
+ }
1260
+
1261
+ finishBundle( renderContext, bundle ) {
1262
+
1263
+ const renderContextData = this.get( renderContext );
1264
+
1265
+ const bundleEncoder = renderContextData.currentPass;
1266
+ const bundleGPU = bundleEncoder.finish();
1267
+
1268
+ this.get( bundle ).bundleGPU = bundleGPU;
1269
+
1270
+ // restore render pass state
1271
+
1272
+ renderContextData.currentSets = renderContextData._currentSets;
1273
+ renderContextData.currentPass = renderContextData._currentPass;
1274
+
1275
+ }
1276
+
1277
+ addBundle( renderContext, bundle ) {
1278
+
1279
+ const renderContextData = this.get( renderContext );
1194
1280
 
1195
- return this.pipelineUtils.createBundleEncoder( renderContext, renderObject );
1281
+ renderContextData.renderBundles.push( this.get( bundle ).bundleGPU );
1196
1282
 
1197
1283
  }
1198
1284
 
1199
1285
  // bindings
1200
1286
 
1201
- createBindings( bindings ) {
1287
+ createBindings( bindGroup ) {
1202
1288
 
1203
- this.bindingUtils.createBindings( bindings );
1289
+ this.bindingUtils.createBindings( bindGroup );
1204
1290
 
1205
1291
  }
1206
1292
 
1207
- updateBindings( bindings ) {
1293
+ updateBindings( bindGroup ) {
1208
1294
 
1209
- this.bindingUtils.createBindings( bindings );
1295
+ this.bindingUtils.createBindings( bindGroup );
1210
1296
 
1211
1297
  }
1212
1298
 
@@ -1276,13 +1362,28 @@ class WebGPUBackend extends Backend {
1276
1362
  let dstX = 0;
1277
1363
  let dstY = 0;
1278
1364
 
1365
+ let srcX = 0;
1366
+ let srcY = 0;
1367
+
1368
+ let srcWidth = srcTexture.image.width;
1369
+ let srcHeight = srcTexture.image.height;
1370
+
1371
+ if ( srcRegion !== null ) {
1372
+
1373
+ srcX = srcRegion.x;
1374
+ srcY = srcRegion.y;
1375
+ srcWidth = srcRegion.width;
1376
+ srcHeight = srcRegion.height;
1377
+
1378
+ }
1379
+
1279
1380
  if ( dstPosition !== null ) {
1280
1381
 
1281
1382
  dstX = dstPosition.x;
1282
1383
  dstY = dstPosition.y;
1283
1384
 
1284
1385
  }
1285
-
1386
+
1286
1387
  const encoder = this.device.createCommandEncoder( { label: 'copyTextureToTexture_' + srcTexture.id + '_' + dstTexture.id } );
1287
1388
 
1288
1389
  const sourceGPU = this.get( srcTexture ).texture;
@@ -1292,7 +1393,7 @@ class WebGPUBackend extends Backend {
1292
1393
  {
1293
1394
  texture: sourceGPU,
1294
1395
  mipLevel: level,
1295
- origin: { x: 0, y: 0, z: 0 }
1396
+ origin: { x: srcX, y: srcY, z: 0 }
1296
1397
  },
1297
1398
  {
1298
1399
  texture: destinationGPU,
@@ -1300,8 +1401,8 @@ class WebGPUBackend extends Backend {
1300
1401
  origin: { x: dstX, y: dstY, z: 0 }
1301
1402
  },
1302
1403
  [
1303
- srcTexture.image.width,
1304
- srcTexture.image.height
1404
+ srcWidth,
1405
+ srcHeight
1305
1406
  ]
1306
1407
  );
1307
1408
 
@@ -1371,12 +1472,17 @@ class WebGPUBackend extends Backend {
1371
1472
 
1372
1473
  if ( texture.generateMipmaps ) this.textureUtils.generateMipmaps( texture );
1373
1474
 
1374
- descriptor.colorAttachments[ 0 ].loadOp = GPULoadOp.Load;
1475
+ for ( let i = 0; i < descriptor.colorAttachments.length; i ++ ) {
1476
+
1477
+ descriptor.colorAttachments[ i ].loadOp = GPULoadOp.Load;
1478
+
1479
+ }
1480
+
1375
1481
  if ( renderContext.depth ) descriptor.depthStencilAttachment.depthLoadOp = GPULoadOp.Load;
1376
1482
  if ( renderContext.stencil ) descriptor.depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
1377
1483
 
1378
1484
  renderContextData.currentPass = encoder.beginRenderPass( descriptor );
1379
- renderContextData.currentSets = { attributes: {} };
1485
+ renderContextData.currentSets = { attributes: {}, pipeline: null, index: null };
1380
1486
 
1381
1487
  }
1382
1488