@plastic-software/three 0.175.13 → 0.178.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 (529) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +7747 -6792
  3. package/build/three.core.js +7371 -6576
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +190 -30
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +19 -11
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +4989 -2235
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +5082 -2469
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +0 -1
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +1 -0
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +18 -4
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +49 -35
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +12 -10
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +2 -1
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +7 -0
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/lighting/TiledLighting.js +1 -0
  76. package/examples/jsm/lights/LightProbeGenerator.js +1 -0
  77. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  78. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  79. package/examples/jsm/lines/Line2.js +1 -0
  80. package/examples/jsm/lines/LineGeometry.js +1 -0
  81. package/examples/jsm/lines/LineMaterial.js +4 -4
  82. package/examples/jsm/lines/LineSegments2.js +1 -0
  83. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  84. package/examples/jsm/lines/Wireframe.js +1 -0
  85. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  86. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  87. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  88. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  89. package/examples/jsm/loaders/3DMLoader.js +1 -0
  90. package/examples/jsm/loaders/3MFLoader.js +1 -0
  91. package/examples/jsm/loaders/AMFLoader.js +1 -0
  92. package/examples/jsm/loaders/BVHLoader.js +1 -0
  93. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  94. package/examples/jsm/loaders/DDSLoader.js +1 -0
  95. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  96. package/examples/jsm/loaders/EXRLoader.js +1 -0
  97. package/examples/jsm/loaders/FBXLoader.js +25 -23
  98. package/examples/jsm/loaders/FontLoader.js +1 -0
  99. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  100. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  101. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  102. package/examples/jsm/loaders/IESLoader.js +1 -0
  103. package/examples/jsm/loaders/KMZLoader.js +1 -0
  104. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  105. package/examples/jsm/loaders/KTXLoader.js +1 -0
  106. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  107. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  108. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  110. package/examples/jsm/loaders/LWOLoader.js +1 -13
  111. package/examples/jsm/loaders/LottieLoader.js +15 -0
  112. package/examples/jsm/loaders/MD2Loader.js +1 -0
  113. package/examples/jsm/loaders/MDDLoader.js +1 -0
  114. package/examples/jsm/loaders/MTLLoader.js +4 -3
  115. package/examples/jsm/loaders/MaterialXLoader.js +1 -0
  116. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  117. package/examples/jsm/loaders/OBJLoader.js +1 -0
  118. package/examples/jsm/loaders/PCDLoader.js +122 -19
  119. package/examples/jsm/loaders/PDBLoader.js +1 -0
  120. package/examples/jsm/loaders/PLYLoader.js +1 -0
  121. package/examples/jsm/loaders/PVRLoader.js +1 -0
  122. package/examples/jsm/loaders/RGBELoader.js +1 -0
  123. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  124. package/examples/jsm/loaders/STLLoader.js +1 -0
  125. package/examples/jsm/loaders/SVGLoader.js +1 -0
  126. package/examples/jsm/loaders/TDSLoader.js +1 -0
  127. package/examples/jsm/loaders/TGALoader.js +1 -0
  128. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  129. package/examples/jsm/loaders/TTFLoader.js +1 -0
  130. package/examples/jsm/loaders/USDZLoader.js +1 -0
  131. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  132. package/examples/jsm/loaders/VOXLoader.js +1 -0
  133. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  134. package/examples/jsm/loaders/VTKLoader.js +1 -0
  135. package/examples/jsm/loaders/XYZLoader.js +1 -0
  136. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  137. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  138. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  139. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  140. package/examples/jsm/math/Capsule.js +2 -0
  141. package/examples/jsm/math/ColorConverter.js +1 -0
  142. package/examples/jsm/math/ConvexHull.js +2 -0
  143. package/examples/jsm/math/ImprovedNoise.js +19 -14
  144. package/examples/jsm/math/Lut.js +2 -0
  145. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  146. package/examples/jsm/math/OBB.js +2 -0
  147. package/examples/jsm/math/Octree.js +20 -1
  148. package/examples/jsm/math/SimplexNoise.js +2 -0
  149. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  150. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  151. package/examples/jsm/misc/Gyroscope.js +1 -0
  152. package/examples/jsm/misc/MD2Character.js +2 -0
  153. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  154. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  155. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  156. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  157. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  158. package/examples/jsm/misc/RollerCoaster.js +5 -0
  159. package/examples/jsm/misc/Timer.js +2 -0
  160. package/examples/jsm/misc/TubePainter.js +1 -0
  161. package/examples/jsm/misc/Volume.js +2 -0
  162. package/examples/jsm/misc/VolumeSlice.js +1 -0
  163. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  164. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  165. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  166. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  167. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  168. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  169. package/examples/jsm/objects/Lensflare.js +3 -0
  170. package/examples/jsm/objects/LensflareMesh.js +1 -0
  171. package/examples/jsm/objects/MarchingCubes.js +2 -0
  172. package/examples/jsm/objects/Reflector.js +1 -0
  173. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  174. package/examples/jsm/objects/Refractor.js +1 -0
  175. package/examples/jsm/objects/ShadowMesh.js +1 -0
  176. package/examples/jsm/objects/Sky.js +2 -1
  177. package/examples/jsm/objects/SkyMesh.js +20 -17
  178. package/examples/jsm/objects/Water.js +1 -0
  179. package/examples/jsm/objects/Water2.js +1 -0
  180. package/examples/jsm/objects/Water2Mesh.js +3 -1
  181. package/examples/jsm/objects/WaterMesh.js +2 -1
  182. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  183. package/examples/jsm/physics/JoltPhysics.js +1 -0
  184. package/examples/jsm/physics/RapierPhysics.js +139 -12
  185. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  186. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  187. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  188. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  189. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  190. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  191. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  192. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  193. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  194. package/examples/jsm/postprocessing/GTAOPass.js +4 -3
  195. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  196. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  197. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  198. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  199. package/examples/jsm/postprocessing/OutlinePass.js +5 -2
  200. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  201. package/examples/jsm/postprocessing/Pass.js +3 -1
  202. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  203. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  204. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  205. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  206. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  207. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  208. package/examples/jsm/postprocessing/SSAOPass.js +2 -1
  209. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  210. package/examples/jsm/postprocessing/SavePass.js +2 -1
  211. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  212. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  213. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  214. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  215. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  216. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  217. package/examples/jsm/renderers/Projector.js +2 -0
  218. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  219. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  220. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  221. package/examples/jsm/shaders/BasicShader.js +4 -1
  222. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  223. package/examples/jsm/shaders/BlendShader.js +4 -1
  224. package/examples/jsm/shaders/BokehShader.js +4 -1
  225. package/examples/jsm/shaders/BokehShader2.js +4 -1
  226. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  227. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  228. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  229. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  230. package/examples/jsm/shaders/CopyShader.js +4 -1
  231. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  232. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  233. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  234. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  235. package/examples/jsm/shaders/ExposureShader.js +4 -1
  236. package/examples/jsm/shaders/FXAAShader.js +4 -1
  237. package/examples/jsm/shaders/FilmShader.js +4 -1
  238. package/examples/jsm/shaders/FocusShader.js +4 -1
  239. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  240. package/examples/jsm/shaders/GTAOShader.js +4 -1
  241. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  242. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  243. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  244. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  245. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  246. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  247. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  248. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  249. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  250. package/examples/jsm/shaders/MirrorShader.js +4 -1
  251. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  252. package/examples/jsm/shaders/OutputShader.js +4 -1
  253. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  254. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  255. package/examples/jsm/shaders/SAOShader.js +4 -1
  256. package/examples/jsm/shaders/SMAAShader.js +1 -0
  257. package/examples/jsm/shaders/SSAOShader.js +4 -1
  258. package/examples/jsm/shaders/SSRShader.js +1 -0
  259. package/examples/jsm/shaders/SepiaShader.js +4 -1
  260. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  261. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  262. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  263. package/examples/jsm/shaders/ToonShader.js +2 -1
  264. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  265. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +4 -1
  266. package/examples/jsm/shaders/VelocityShader.js +4 -1
  267. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  268. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  269. package/examples/jsm/shaders/VignetteShader.js +4 -1
  270. package/examples/jsm/shaders/VolumeShader.js +5 -2
  271. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  272. package/examples/jsm/textures/FlakesTexture.js +2 -0
  273. package/examples/jsm/transpiler/AST.js +381 -30
  274. package/examples/jsm/transpiler/GLSLDecoder.js +226 -87
  275. package/examples/jsm/transpiler/Linker.js +327 -0
  276. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  277. package/examples/jsm/transpiler/Transpiler.js +19 -1
  278. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  279. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  280. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  281. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  282. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  283. package/examples/jsm/tsl/display/BloomNode.js +1 -0
  284. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  285. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  286. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  287. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  288. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  289. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  290. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  291. package/examples/jsm/tsl/display/GaussianBlurNode.js +4 -29
  292. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  293. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  294. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  295. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  296. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  297. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  298. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  299. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  300. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  301. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  302. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  303. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  304. package/examples/jsm/tsl/display/TRAAPassNode.js +5 -4
  305. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  306. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  307. package/examples/jsm/tsl/lighting/TiledLightsNode.js +4 -3
  308. package/examples/jsm/tsl/math/Bayer.js +4 -1
  309. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  310. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  311. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  312. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  313. package/examples/jsm/utils/CameraUtils.js +4 -1
  314. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  315. package/examples/jsm/utils/GeometryUtils.js +4 -1
  316. package/examples/jsm/utils/LDrawUtils.js +2 -0
  317. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  318. package/examples/jsm/utils/SceneUtils.js +4 -1
  319. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  320. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  321. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  322. package/examples/jsm/utils/SortUtils.js +4 -1
  323. package/examples/jsm/utils/UVsDebug.js +4 -1
  324. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  325. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  326. package/examples/jsm/utils/WorkerPool.js +2 -0
  327. package/examples/jsm/webxr/ARButton.js +1 -0
  328. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  329. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  330. package/examples/jsm/webxr/Text2D.js +4 -1
  331. package/examples/jsm/webxr/VRButton.js +1 -0
  332. package/examples/jsm/webxr/XRButton.js +1 -0
  333. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  334. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  335. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  336. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  338. package/examples/jsm/webxr/XRPlanes.js +1 -0
  339. package/package.json +6 -4
  340. package/src/Three.Core.js +1 -1
  341. package/src/Three.TSL.js +18 -10
  342. package/src/Three.WebGPU.Nodes.js +1 -0
  343. package/src/Three.WebGPU.js +3 -0
  344. package/src/audio/AudioListener.js +13 -10
  345. package/src/cameras/ArrayCamera.js +9 -1
  346. package/src/constants.js +47 -20
  347. package/src/core/BufferAttribute.js +3 -3
  348. package/src/core/BufferGeometry.js +2 -5
  349. package/src/core/Clock.js +2 -8
  350. package/src/core/GLBufferAttribute.js +13 -1
  351. package/src/core/Object3D.js +23 -22
  352. package/src/core/RenderTarget.js +65 -21
  353. package/src/core/RenderTarget3D.js +1 -0
  354. package/src/extras/TextureUtils.js +1 -5
  355. package/src/extras/core/Curve.js +1 -1
  356. package/src/extras/core/Path.js +22 -22
  357. package/src/geometries/CapsuleGeometry.js +167 -17
  358. package/src/geometries/ExtrudeGeometry.js +39 -29
  359. package/src/helpers/ArrowHelper.js +2 -2
  360. package/src/helpers/SkeletonHelper.js +1 -1
  361. package/src/lights/LightShadow.js +14 -0
  362. package/src/lights/SpotLightShadow.js +9 -1
  363. package/src/lights/webgpu/ProjectorLight.js +46 -0
  364. package/src/loaders/BufferGeometryLoader.js +1 -10
  365. package/src/loaders/FileLoader.js +2 -2
  366. package/src/loaders/ImageBitmapLoader.js +25 -9
  367. package/src/loaders/ImageLoader.js +55 -8
  368. package/src/loaders/ObjectLoader.js +44 -16
  369. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  370. package/src/materials/Material.js +1 -7
  371. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  372. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  373. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  374. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  375. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  376. package/src/materials/nodes/NodeMaterial.js +105 -19
  377. package/src/materials/nodes/manager/NodeMaterialObserver.js +20 -2
  378. package/src/math/Box3.js +28 -0
  379. package/src/math/Color.js +7 -7
  380. package/src/math/ColorManagement.js +22 -3
  381. package/src/math/Frustum.js +6 -1
  382. package/src/math/FrustumArray.js +253 -0
  383. package/src/math/Quaternion.js +1 -1
  384. package/src/math/Ray.js +2 -0
  385. package/src/math/Sphere.js +28 -0
  386. package/src/nodes/Nodes.js +2 -3
  387. package/src/nodes/TSL.js +5 -3
  388. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  389. package/src/nodes/accessors/Bitangent.js +54 -26
  390. package/src/nodes/accessors/Camera.js +31 -4
  391. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  392. package/src/nodes/accessors/InstanceNode.js +5 -4
  393. package/src/nodes/accessors/Lights.js +2 -2
  394. package/src/nodes/accessors/MaterialNode.js +4 -0
  395. package/src/nodes/accessors/ModelNode.js +1 -1
  396. package/src/nodes/accessors/Normal.js +102 -16
  397. package/src/nodes/accessors/Object3DNode.js +7 -8
  398. package/src/nodes/accessors/Position.js +14 -4
  399. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  400. package/src/nodes/accessors/ReferenceNode.js +1 -1
  401. package/src/nodes/accessors/ReflectVector.js +3 -3
  402. package/src/nodes/accessors/SkinningNode.js +3 -2
  403. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  404. package/src/nodes/accessors/StorageTextureNode.js +14 -3
  405. package/src/nodes/accessors/Tangent.js +25 -17
  406. package/src/nodes/accessors/TangentUtils.js +46 -0
  407. package/src/nodes/accessors/TextureBicubic.js +21 -3
  408. package/src/nodes/accessors/TextureNode.js +59 -8
  409. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  410. package/src/nodes/accessors/VelocityNode.js +1 -0
  411. package/src/nodes/accessors/VertexColorNode.js +4 -4
  412. package/src/nodes/code/CodeNode.js +8 -11
  413. package/src/nodes/core/AssignNode.js +27 -5
  414. package/src/nodes/core/AttributeNode.js +2 -2
  415. package/src/nodes/core/ContextNode.js +7 -3
  416. package/src/nodes/core/Node.js +69 -20
  417. package/src/nodes/core/NodeBuilder.js +248 -29
  418. package/src/nodes/core/NodeUtils.js +42 -0
  419. package/src/nodes/core/NodeVarying.js +19 -1
  420. package/src/nodes/core/PropertyNode.js +8 -12
  421. package/src/nodes/core/StackNode.js +129 -26
  422. package/src/nodes/core/StructTypeNode.js +26 -4
  423. package/src/nodes/core/SubBuildNode.js +89 -0
  424. package/src/nodes/core/VarNode.js +11 -2
  425. package/src/nodes/core/VaryingNode.js +45 -24
  426. package/src/nodes/display/BlendModes.js +42 -1
  427. package/src/nodes/display/ColorSpaceNode.js +4 -27
  428. package/src/nodes/display/FrontFacingNode.js +34 -2
  429. package/src/nodes/display/NormalMapNode.js +19 -50
  430. package/src/nodes/display/PassNode.js +18 -19
  431. package/src/nodes/display/ScreenNode.js +0 -26
  432. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  433. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  434. package/src/nodes/functions/PhongLightingModel.js +3 -3
  435. package/src/nodes/functions/PhysicalLightingModel.js +14 -14
  436. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  437. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  438. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  439. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  440. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  441. package/src/nodes/gpgpu/ComputeNode.js +1 -1
  442. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  443. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  444. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  445. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  446. package/src/nodes/lighting/LightsNode.js +29 -11
  447. package/src/nodes/lighting/ProjectorLightNode.js +78 -0
  448. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  449. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  450. package/src/nodes/lighting/ShadowNode.js +174 -242
  451. package/src/nodes/lighting/SpotLightNode.js +44 -7
  452. package/src/nodes/materialx/lib/mx_noise.js +1 -1
  453. package/src/nodes/math/ConditionalNode.js +0 -19
  454. package/src/nodes/math/MathNode.js +68 -21
  455. package/src/nodes/math/OperatorNode.js +108 -98
  456. package/src/nodes/shapes/Shapes.js +5 -4
  457. package/src/nodes/tsl/TSLBase.js +1 -0
  458. package/src/nodes/tsl/TSLCore.js +160 -65
  459. package/src/nodes/utils/DebugNode.js +15 -3
  460. package/src/nodes/utils/Discard.js +2 -2
  461. package/src/nodes/utils/EquirectUV.js +27 -0
  462. package/src/nodes/utils/LoopNode.js +64 -34
  463. package/src/nodes/utils/MatcapUV.js +22 -0
  464. package/src/nodes/utils/RTTNode.js +13 -5
  465. package/src/nodes/utils/ReflectorNode.js +77 -7
  466. package/src/nodes/utils/SampleNode.js +81 -0
  467. package/src/nodes/utils/TriplanarTextures.js +65 -0
  468. package/src/objects/BatchedMesh.js +16 -4
  469. package/src/objects/Mesh.js +9 -0
  470. package/src/objects/Skeleton.js +1 -1
  471. package/src/objects/Sprite.js +9 -0
  472. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  473. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  474. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  475. package/src/renderers/WebGLRenderer.js +25 -11
  476. package/src/renderers/common/Animation.js +2 -2
  477. package/src/renderers/common/Background.js +13 -2
  478. package/src/renderers/common/CubeRenderTarget.js +1 -1
  479. package/src/renderers/common/RenderList.js +0 -4
  480. package/src/renderers/common/RenderObject.js +80 -4
  481. package/src/renderers/common/Renderer.js +116 -8
  482. package/src/renderers/common/Storage3DTexture.js +79 -0
  483. package/src/renderers/common/StorageArrayTexture.js +63 -0
  484. package/src/renderers/common/Textures.js +15 -21
  485. package/src/renderers/common/TimestampQueryPool.js +1 -0
  486. package/src/renderers/common/Uniform.js +1 -1
  487. package/src/renderers/common/UniformsGroup.js +14 -18
  488. package/src/renderers/common/XRManager.js +157 -27
  489. package/src/renderers/common/XRRenderTarget.js +21 -4
  490. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  491. package/src/renderers/common/nodes/Nodes.js +13 -3
  492. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +1 -1
  493. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  494. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  495. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  496. package/src/renderers/webgl/WebGLPrograms.js +4 -2
  497. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  498. package/src/renderers/webgl/WebGLState.js +4 -4
  499. package/src/renderers/webgl/WebGLTextures.js +144 -4
  500. package/src/renderers/webgl/WebGLUtils.js +1 -3
  501. package/src/renderers/webgl-fallback/WebGLBackend.js +244 -87
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +73 -7
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  504. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  507. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  508. package/src/renderers/webgpu/WebGPUBackend.js +451 -128
  509. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  510. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  511. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  512. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +86 -33
  513. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  514. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  515. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +28 -5
  516. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  517. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -8
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +45 -50
  519. package/src/renderers/webxr/WebXRController.js +1 -1
  520. package/src/renderers/webxr/WebXRManager.js +2 -1
  521. package/src/textures/DepthTexture.js +6 -10
  522. package/src/textures/Source.js +22 -0
  523. package/src/textures/Texture.js +118 -1
  524. package/src/textures/VideoTexture.js +1 -1
  525. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  526. package/src/core/RenderTargetArray.js +0 -40
  527. package/src/nodes/utils/EquirectUVNode.js +0 -65
  528. package/src/nodes/utils/MatcapUVNode.js +0 -49
  529. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -37,6 +37,7 @@ class WebGPURenderer extends Renderer {
37
37
  * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
38
38
  * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.
39
39
  * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.
40
+ * @property {boolean} [multiview=false] - If set to `true`, the renderer will use multiview during WebXR rendering if supported.
40
41
  * @property {number} [outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead.
41
42
  * @property {number} [colorBufferType=HalfFloatType] - Defines the type of color buffers. The default `HalfFloatType` is recommend for best
42
43
  * quality. To save memory and bandwidth, `UnsignedByteType` might be used. This will reduce rendering quality though.
@@ -91,6 +92,12 @@ class WebGPURenderer extends Renderer {
91
92
  */
92
93
  this.isWebGPURenderer = true;
93
94
 
95
+ if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
96
+
97
+ __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );
98
+
99
+ }
100
+
94
101
  }
95
102
 
96
103
  }
@@ -9,6 +9,7 @@ import { AmbientLight } from '../../../lights/AmbientLight.js';
9
9
  import { HemisphereLight } from '../../../lights/HemisphereLight.js';
10
10
  import { LightProbe } from '../../../lights/LightProbe.js';
11
11
  import IESSpotLight from '../../../lights/webgpu/IESSpotLight.js';
12
+ import ProjectorLight from '../../../lights/webgpu/ProjectorLight.js';
12
13
  import {
13
14
  PointLightNode,
14
15
  DirectionalLightNode,
@@ -17,7 +18,8 @@ import {
17
18
  AmbientLightNode,
18
19
  HemisphereLightNode,
19
20
  LightProbeNode,
20
- IESSpotLightNode
21
+ IESSpotLightNode,
22
+ ProjectorLightNode
21
23
  } from '../../../nodes/Nodes.js';
22
24
 
23
25
  // Tone Mapping
@@ -48,6 +50,7 @@ class BasicNodeLibrary extends NodeLibrary {
48
50
  this.addLight( HemisphereLightNode, HemisphereLight );
49
51
  this.addLight( LightProbeNode, LightProbe );
50
52
  this.addLight( IESSpotLightNode, IESSpotLight );
53
+ this.addLight( ProjectorLightNode, ProjectorLight );
51
54
 
52
55
  this.addToneMapping( linearToneMapping, LinearToneMapping );
53
56
  this.addToneMapping( reinhardToneMapping, ReinhardToneMapping );
@@ -28,6 +28,7 @@ import { AmbientLight } from '../../../lights/AmbientLight.js';
28
28
  import { HemisphereLight } from '../../../lights/HemisphereLight.js';
29
29
  import { LightProbe } from '../../../lights/LightProbe.js';
30
30
  import IESSpotLight from '../../../lights/webgpu/IESSpotLight.js';
31
+ import ProjectorLight from '../../../lights/webgpu/ProjectorLight.js';
31
32
  import {
32
33
  PointLightNode,
33
34
  DirectionalLightNode,
@@ -36,7 +37,8 @@ import {
36
37
  AmbientLightNode,
37
38
  HemisphereLightNode,
38
39
  LightProbeNode,
39
- IESSpotLightNode
40
+ IESSpotLightNode,
41
+ ProjectorLightNode
40
42
  } from '../../../nodes/Nodes.js';
41
43
 
42
44
  // Tone Mapping
@@ -82,6 +84,7 @@ class StandardNodeLibrary extends NodeLibrary {
82
84
  this.addLight( HemisphereLightNode, HemisphereLight );
83
85
  this.addLight( LightProbeNode, LightProbe );
84
86
  this.addLight( IESSpotLightNode, IESSpotLight );
87
+ this.addLight( ProjectorLightNode, ProjectorLight );
85
88
 
86
89
  this.addToneMapping( linearToneMapping, LinearToneMapping );
87
90
  this.addToneMapping( reinhardToneMapping, ReinhardToneMapping );
@@ -248,13 +248,9 @@ class WGSLNodeBuilder extends NodeBuilder {
248
248
 
249
249
  }
250
250
 
251
- } else if ( this.isFilteredTexture( texture ) ) {
252
-
253
- return this.generateFilteredTexture( texture, textureProperty, uvSnippet );
254
-
255
251
  } else {
256
252
 
257
- return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, '0' );
253
+ return this._generateTextureSampleLevel( texture, textureProperty, uvSnippet, '0', depthSnippet );
258
254
 
259
255
  }
260
256
 
@@ -291,13 +287,12 @@ class WGSLNodeBuilder extends NodeBuilder {
291
287
  * @param {string} textureProperty - The name of the texture uniform in the shader.
292
288
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
293
289
  * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
294
- * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
295
- * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
290
+ * @param {string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
296
291
  * @return {string} The WGSL snippet.
297
292
  */
298
- _generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage = this.shaderStage ) {
293
+ _generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet ) {
299
294
 
300
- if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false ) {
295
+ if ( this.isUnfilterable( texture ) === false ) {
301
296
 
302
297
  return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
303
298
 
@@ -453,7 +448,7 @@ class WGSLNodeBuilder extends NodeBuilder {
453
448
 
454
449
  textureData.dimensionsSnippet[ levelSnippet ] = textureDimensionNode;
455
450
 
456
- if ( texture.isDataArrayTexture || texture.isData3DTexture ) {
451
+ if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {
457
452
 
458
453
  textureData.arrayLayerCount = new VarNode(
459
454
  new ExpressionNode(
@@ -516,7 +511,7 @@ class WGSLNodeBuilder extends NodeBuilder {
516
511
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
517
512
 
518
513
  const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
519
- const coordSnippet = `${ vecType }<u32>(${ wrapFunction }(${ uvSnippet }) * ${ vecType }<f32>(${ textureDimension }))`;
514
+ const coordSnippet = `${ vecType }<u32>( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) )`;
520
515
 
521
516
  return this.generateTextureLoad( texture, textureProperty, coordSnippet, depthSnippet, levelSnippet );
522
517
 
@@ -534,20 +529,30 @@ class WGSLNodeBuilder extends NodeBuilder {
534
529
  */
535
530
  generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet, levelSnippet = '0u' ) {
536
531
 
537
- if ( texture.isVideoTexture === true || texture.isStorageTexture === true ) {
532
+ let snippet;
533
+
534
+ if ( texture.isVideoTexture === true ) {
538
535
 
539
- return `textureLoad( ${ textureProperty }, ${ uvIndexSnippet } )`;
536
+ snippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet } )`;
540
537
 
541
538
  } else if ( depthSnippet ) {
542
539
 
543
- return `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, ${ depthSnippet }, u32( ${ levelSnippet } ) )`;
540
+ snippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, ${ depthSnippet }, u32( ${ levelSnippet } ) )`;
544
541
 
545
542
  } else {
546
543
 
547
- return `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, u32( ${ levelSnippet } ) )`;
544
+ snippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, u32( ${ levelSnippet } ) )`;
545
+
546
+ if ( this.renderer.backend.compatibilityMode && texture.isDepthTexture ) {
547
+
548
+ snippet += '.x';
549
+
550
+ }
548
551
 
549
552
  }
550
553
 
554
+ return snippet;
555
+
551
556
  }
552
557
 
553
558
  /**
@@ -556,12 +561,25 @@ class WGSLNodeBuilder extends NodeBuilder {
556
561
  * @param {Texture} texture - The texture.
557
562
  * @param {string} textureProperty - The name of the texture uniform in the shader.
558
563
  * @param {string} uvIndexSnippet - A WGSL snippet that represents texture coordinates used for sampling.
564
+ * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
559
565
  * @param {string} valueSnippet - A WGSL snippet that represent the new texel value.
560
566
  * @return {string} The WGSL snippet.
561
567
  */
562
- generateTextureStore( texture, textureProperty, uvIndexSnippet, valueSnippet ) {
568
+ generateTextureStore( texture, textureProperty, uvIndexSnippet, depthSnippet, valueSnippet ) {
563
569
 
564
- return `textureStore( ${ textureProperty }, ${ uvIndexSnippet }, ${ valueSnippet } )`;
570
+ let snippet;
571
+
572
+ if ( depthSnippet ) {
573
+
574
+ snippet = `textureStore( ${ textureProperty }, ${ uvIndexSnippet }, ${ depthSnippet }, ${ valueSnippet } )`;
575
+
576
+ } else {
577
+
578
+ snippet = `textureStore( ${ textureProperty }, ${ uvIndexSnippet }, ${ valueSnippet } )`;
579
+
580
+ }
581
+
582
+ return snippet;
565
583
 
566
584
  }
567
585
 
@@ -666,6 +684,12 @@ class WGSLNodeBuilder extends NodeBuilder {
666
684
 
667
685
  if ( shaderStage === 'fragment' ) {
668
686
 
687
+ if ( texture.isDepthTexture === true && texture.isArrayTexture === true ) {
688
+
689
+ return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet } )`;
690
+
691
+ }
692
+
669
693
  return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet } )`;
670
694
 
671
695
  } else {
@@ -697,7 +721,7 @@ class WGSLNodeBuilder extends NodeBuilder {
697
721
 
698
722
  } else {
699
723
 
700
- snippet = this._generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage );
724
+ snippet = this._generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet );
701
725
 
702
726
  }
703
727
 
@@ -890,7 +914,7 @@ class WGSLNodeBuilder extends NodeBuilder {
890
914
  texture.store = node.isStorageTextureNode === true;
891
915
  texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
892
916
 
893
- if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( node.value ) === false && texture.store === false ) {
917
+ if ( this.isUnfilterable( node.value ) === false && texture.store === false ) {
894
918
 
895
919
  const sampler = new NodeSampler( `${ uniformNode.name }_sampler`, uniformNode.node, group );
896
920
  sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
@@ -1560,10 +1584,17 @@ ${ flowData.code }
1560
1584
 
1561
1585
  let attributesSnippet = `@location( ${index} )`;
1562
1586
 
1563
- if ( /^(int|uint|ivec|uvec)/.test( varying.type ) ) {
1587
+ if ( varying.interpolationType ) {
1564
1588
 
1565
- attributesSnippet += ' @interpolate( flat )';
1589
+ const samplingSnippet = varying.interpolationSampling !== null ? `, ${ varying.interpolationSampling } )` : ' )';
1566
1590
 
1591
+ attributesSnippet += ` @interpolate( ${ varying.interpolationType }${ samplingSnippet }`;
1592
+
1593
+ // Otherwise, optimize interpolation when sensible
1594
+
1595
+ } else if ( /^(int|uint|ivec|uvec)/.test( varying.type ) ) {
1596
+
1597
+ attributesSnippet += ` @interpolate( ${ this.renderer.backend.compatibilityMode ? 'flat, either' : 'flat' } )`;
1567
1598
 
1568
1599
  }
1569
1600
 
@@ -1591,7 +1622,16 @@ ${ flowData.code }
1591
1622
 
1592
1623
  isCustomStruct( nodeUniform ) {
1593
1624
 
1594
- return nodeUniform.value.isStorageBufferAttribute && nodeUniform.node.structTypeNode !== null;
1625
+ const attribute = nodeUniform.value;
1626
+ const bufferNode = nodeUniform.node;
1627
+
1628
+ const isAttributeStructType = ( attribute.isBufferAttribute || attribute.isInstancedBufferAttribute ) && bufferNode.structTypeNode !== null;
1629
+
1630
+ const isStructArray =
1631
+ ( bufferNode.value && bufferNode.value.array ) &&
1632
+ ( typeof bufferNode.value.itemSize === 'number' && bufferNode.value.array.length > bufferNode.value.itemSize );
1633
+
1634
+ return isAttributeStructType && ! isStructArray;
1595
1635
 
1596
1636
  }
1597
1637
 
@@ -1619,7 +1659,7 @@ ${ flowData.code }
1619
1659
 
1620
1660
  const texture = uniform.node.value;
1621
1661
 
1622
- if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) {
1662
+ if ( this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) {
1623
1663
 
1624
1664
  if ( this.isSampleCompare( texture ) ) {
1625
1665
 
@@ -1649,28 +1689,41 @@ ${ flowData.code }
1649
1689
 
1650
1690
  textureType = 'texture_cube<f32>';
1651
1691
 
1652
- } else if ( texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {
1653
-
1654
- textureType = 'texture_2d_array<f32>';
1655
-
1656
1692
  } else if ( texture.isDepthTexture === true ) {
1657
1693
 
1658
- textureType = `texture_depth${multisampled}_2d`;
1694
+ if ( this.renderer.backend.compatibilityMode && texture.compareFunction === null ) {
1659
1695
 
1660
- } else if ( texture.isVideoTexture === true ) {
1696
+ textureType = `texture${ multisampled }_2d<f32>`;
1661
1697
 
1662
- textureType = 'texture_external';
1698
+ } else {
1663
1699
 
1664
- } else if ( texture.isData3DTexture === true ) {
1700
+ textureType = `texture_depth${ multisampled }_2d${ texture.isArrayTexture === true ? '_array' : '' }`;
1665
1701
 
1666
- textureType = 'texture_3d<f32>';
1702
+ }
1667
1703
 
1668
1704
  } else if ( uniform.node.isStorageTextureNode === true ) {
1669
1705
 
1670
1706
  const format = getFormat( texture );
1671
1707
  const access = this.getStorageAccess( uniform.node, shaderStage );
1672
1708
 
1673
- textureType = `texture_storage_2d<${ format }, ${ access }>`;
1709
+ const is3D = uniform.node.value.is3DTexture;
1710
+ const isArrayTexture = uniform.node.value.isArrayTexture;
1711
+
1712
+ const dimension = is3D ? '3d' : `2d${ isArrayTexture ? '_array' : '' }`;
1713
+
1714
+ textureType = `texture_storage_${ dimension }<${ format }, ${ access }>`;
1715
+
1716
+ } else if ( texture.isArrayTexture === true || texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {
1717
+
1718
+ textureType = 'texture_2d_array<f32>';
1719
+
1720
+ } else if ( texture.is3DTexture === true || texture.isData3DTexture === true ) {
1721
+
1722
+ textureType = 'texture_3d<f32>';
1723
+
1724
+ } else if ( texture.isVideoTexture === true ) {
1725
+
1726
+ textureType = 'texture_external';
1674
1727
 
1675
1728
  } else {
1676
1729
 
@@ -58,7 +58,10 @@ const wgslTypeLib = {
58
58
  'texture_multisampled_2d': 'cubeTexture',
59
59
 
60
60
  'texture_depth_2d': 'depthTexture',
61
+ 'texture_depth_2d_array': 'depthTexture',
61
62
  'texture_depth_multisampled_2d': 'depthTexture',
63
+ 'texture_depth_cube': 'depthTexture',
64
+ 'texture_depth_cube_array': 'depthTexture',
62
65
 
63
66
  'texture_3d': 'texture3D',
64
67
 
@@ -12,6 +12,12 @@ const typedArraysToVertexFormatPrefix = new Map( [
12
12
  [ Float32Array, [ 'float32', ]],
13
13
  ] );
14
14
 
15
+ if ( typeof Float16Array !== 'undefined' ) {
16
+
17
+ typedArraysToVertexFormatPrefix.set( Float16Array, [ 'float16' ] );
18
+
19
+ }
20
+
15
21
  const typedAttributeToVertexFormatPrefix = new Map( [
16
22
  [ Float16BufferAttribute, [ 'float16', ]],
17
23
  ] );
@@ -113,7 +119,9 @@ class WebGPUAttributeUtils {
113
119
 
114
120
  }
115
121
 
116
- const size = array.byteLength + ( ( 4 - ( array.byteLength % 4 ) ) % 4 ); // ensure 4 byte alignment, see #20441
122
+ // ensure 4 byte alignment
123
+ const byteLength = array.byteLength;
124
+ const size = byteLength + ( ( 4 - ( byteLength % 4 ) ) % 4 );
117
125
 
118
126
  buffer = device.createBuffer( {
119
127
  label: bufferAttribute.name,
@@ -1,5 +1,6 @@
1
1
  import {
2
- GPUTextureAspect, GPUTextureViewDimension, GPUTextureSampleType, GPUBufferBindingType, GPUStorageTextureAccess
2
+ GPUTextureAspect, GPUTextureViewDimension, GPUTextureSampleType, GPUBufferBindingType, GPUStorageTextureAccess,
3
+ GPUSamplerBindingType
3
4
  } from './WebGPUConstants.js';
4
5
 
5
6
  import { FloatType, IntType, UnsignedIntType } from '../../../constants.js';
@@ -100,7 +101,11 @@ class WebGPUBindingUtils {
100
101
 
101
102
  if ( binding.texture.compareFunction !== null ) {
102
103
 
103
- sampler.type = 'comparison';
104
+ sampler.type = GPUSamplerBindingType.Comparison;
105
+
106
+ } else if ( backend.compatibilityMode ) {
107
+
108
+ sampler.type = GPUSamplerBindingType.NonFiltering;
104
109
 
105
110
  }
106
111
 
@@ -133,6 +138,16 @@ class WebGPUBindingUtils {
133
138
 
134
139
  }
135
140
 
141
+ if ( binding.texture.isArrayTexture ) {
142
+
143
+ storageTexture.viewDimension = GPUTextureViewDimension.TwoDArray;
144
+
145
+ } else if ( binding.texture.is3DTexture ) {
146
+
147
+ storageTexture.viewDimension = GPUTextureViewDimension.ThreeD;
148
+
149
+ }
150
+
136
151
  bindingGPU.storageTexture = storageTexture;
137
152
 
138
153
  } else if ( binding.isSampledTexture ) {
@@ -155,7 +170,15 @@ class WebGPUBindingUtils {
155
170
 
156
171
  if ( binding.texture.isDepthTexture ) {
157
172
 
158
- texture.sampleType = GPUTextureSampleType.Depth;
173
+ if ( backend.compatibilityMode && binding.texture.compareFunction === null ) {
174
+
175
+ texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
176
+
177
+ } else {
178
+
179
+ texture.sampleType = GPUTextureSampleType.Depth;
180
+
181
+ }
159
182
 
160
183
  } else if ( binding.texture.isDataTexture || binding.texture.isDataArrayTexture || binding.texture.isData3DTexture ) {
161
184
 
@@ -189,7 +212,7 @@ class WebGPUBindingUtils {
189
212
 
190
213
  texture.viewDimension = GPUTextureViewDimension.Cube;
191
214
 
192
- } else if ( binding.texture.isDataArrayTexture || binding.texture.isCompressedArrayTexture ) {
215
+ } else if ( binding.texture.isArrayTexture || binding.texture.isDataArrayTexture || binding.texture.isCompressedArrayTexture ) {
193
216
 
194
217
  texture.viewDimension = GPUTextureViewDimension.TwoDArray;
195
218
 
@@ -419,7 +442,7 @@ class WebGPUBindingUtils {
419
442
 
420
443
  dimensionViewGPU = GPUTextureViewDimension.ThreeD;
421
444
 
422
- } else if ( binding.texture.isDataArrayTexture || binding.texture.isCompressedArrayTexture ) {
445
+ } else if ( binding.texture.isArrayTexture || binding.texture.isDataArrayTexture || binding.texture.isCompressedArrayTexture ) {
423
446
 
424
447
  dimensionViewGPU = GPUTextureViewDimension.TwoDArray;
425
448
 
@@ -227,7 +227,7 @@ export const GPUBlendFactor = {
227
227
  SrcAlpha: 'src-alpha',
228
228
  OneMinusSrcAlpha: 'one-minus-src-alpha',
229
229
  Dst: 'dst',
230
- OneMinusDstColor: 'one-minus-dst',
230
+ OneMinusDst: 'one-minus-dst',
231
231
  DstAlpha: 'dst-alpha',
232
232
  OneMinusDstAlpha: 'one-minus-dst-alpha',
233
233
  SrcAlphaSaturated: 'src-alpha-saturated',
@@ -316,18 +316,24 @@ export const GPUInputStepMode = {
316
316
  };
317
317
 
318
318
  export const GPUFeatureName = {
319
+ CoreFeaturesAndLimits: 'core-features-and-limits',
319
320
  DepthClipControl: 'depth-clip-control',
320
321
  Depth32FloatStencil8: 'depth32float-stencil8',
321
322
  TextureCompressionBC: 'texture-compression-bc',
323
+ TextureCompressionBCSliced3D: 'texture-compression-bc-sliced-3d',
322
324
  TextureCompressionETC2: 'texture-compression-etc2',
323
325
  TextureCompressionASTC: 'texture-compression-astc',
326
+ TextureCompressionASTCSliced3D: 'texture-compression-astc-sliced-3d',
324
327
  TimestampQuery: 'timestamp-query',
325
328
  IndirectFirstInstance: 'indirect-first-instance',
326
329
  ShaderF16: 'shader-f16',
327
330
  RG11B10UFloat: 'rg11b10ufloat-renderable',
328
331
  BGRA8UNormStorage: 'bgra8unorm-storage',
329
332
  Float32Filterable: 'float32-filterable',
333
+ Float32Blendable: 'float32-blendable',
330
334
  ClipDistances: 'clip-distances',
331
335
  DualSourceBlending: 'dual-source-blending',
332
- Subgroups: 'subgroups'
336
+ Subgroups: 'subgroups',
337
+ TextureFormatsTier1: 'texture-formats-tier1',
338
+ TextureFormatsTier2: 'texture-formats-tier2'
333
339
  };
@@ -36,6 +36,35 @@ class WebGPUPipelineUtils {
36
36
  */
37
37
  this.backend = backend;
38
38
 
39
+ /**
40
+ * A Weak Map that tracks the active pipeline for render or compute passes.
41
+ *
42
+ * @private
43
+ * @type {WeakMap<(GPURenderPassEncoder|GPUComputePassEncoder),(GPURenderPipeline|GPUComputePipeline)>}
44
+ */
45
+ this._activePipelines = new WeakMap();
46
+
47
+ }
48
+
49
+ /**
50
+ * Sets the given pipeline for the given pass. The method makes sure to only set the
51
+ * pipeline when necessary.
52
+ *
53
+ * @param {(GPURenderPassEncoder|GPUComputePassEncoder)} pass - The pass encoder.
54
+ * @param {(GPURenderPipeline|GPUComputePipeline)} pipeline - The pipeline.
55
+ */
56
+ setPipeline( pass, pipeline ) {
57
+
58
+ const currentPipeline = this._activePipelines.get( pass );
59
+
60
+ if ( currentPipeline !== pipeline ) {
61
+
62
+ pass.setPipeline( pipeline );
63
+
64
+ this._activePipelines.set( pass, pipeline );
65
+
66
+ }
67
+
39
68
  }
40
69
 
41
70
  /**
@@ -88,7 +117,7 @@ class WebGPUPipelineUtils {
88
117
 
89
118
  let blending;
90
119
 
91
- if ( material.transparent === true && material.blending !== NoBlending ) {
120
+ if ( material.blending !== NoBlending && ( material.blending !== NormalBlending || material.transparent !== false ) ) {
92
121
 
93
122
  blending = this._getBlending( material );
94
123
 
@@ -228,9 +257,10 @@ class WebGPUPipelineUtils {
228
257
  * Creates GPU render bundle encoder for the given render context.
229
258
  *
230
259
  * @param {RenderContext} renderContext - The render context.
260
+ * @param {?string} [label='renderBundleEncoder'] - The label.
231
261
  * @return {GPURenderBundleEncoder} The GPU render bundle encoder.
232
262
  */
233
- createBundleEncoder( renderContext ) {
263
+ createBundleEncoder( renderContext, label = 'renderBundleEncoder' ) {
234
264
 
235
265
  const backend = this.backend;
236
266
  const { utils, device } = backend;
@@ -240,7 +270,7 @@ class WebGPUPipelineUtils {
240
270
  const sampleCount = this._getSampleCount( renderContext );
241
271
 
242
272
  const descriptor = {
243
- label: 'renderBundleEncoder',
273
+ label: label,
244
274
  colorFormats: [ colorFormat ],
245
275
  depthStencilFormat,
246
276
  sampleCount
@@ -359,7 +389,7 @@ class WebGPUPipelineUtils {
359
389
  break;
360
390
 
361
391
  case MultiplyBlending:
362
- setBlend( GPUBlendFactor.Zero, GPUBlendFactor.Src, GPUBlendFactor.Zero, GPUBlendFactor.SrcAlpha );
392
+ setBlend( GPUBlendFactor.Dst, GPUBlendFactor.OneMinusSrcAlpha, GPUBlendFactor.Zero, GPUBlendFactor.One );
363
393
  break;
364
394
 
365
395
  }
@@ -373,15 +403,15 @@ class WebGPUPipelineUtils {
373
403
  break;
374
404
 
375
405
  case AdditiveBlending:
376
- setBlend( GPUBlendFactor.SrcAlpha, GPUBlendFactor.One, GPUBlendFactor.SrcAlpha, GPUBlendFactor.One );
406
+ setBlend( GPUBlendFactor.SrcAlpha, GPUBlendFactor.One, GPUBlendFactor.One, GPUBlendFactor.One );
377
407
  break;
378
408
 
379
409
  case SubtractiveBlending:
380
- setBlend( GPUBlendFactor.Zero, GPUBlendFactor.OneMinusSrc, GPUBlendFactor.Zero, GPUBlendFactor.One );
410
+ console.error( 'THREE.WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true' );
381
411
  break;
382
412
 
383
413
  case MultiplyBlending:
384
- setBlend( GPUBlendFactor.Zero, GPUBlendFactor.Src, GPUBlendFactor.Zero, GPUBlendFactor.Src );
414
+ console.error( 'THREE.WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true' );
385
415
  break;
386
416
 
387
417
  }
@@ -443,7 +473,7 @@ class WebGPUPipelineUtils {
443
473
  break;
444
474
 
445
475
  case OneMinusDstColorFactor:
446
- blendFactor = GPUBlendFactor.OneMinusDstColor;
476
+ blendFactor = GPUBlendFactor.OneMinusDst;
447
477
  break;
448
478
 
449
479
  case DstAlphaFactor: