@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
@@ -31,6 +31,7 @@ class WebGPUBackend extends Backend {
31
31
  * @typedef {Object} WebGPUBackend~Options
32
32
  * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
33
33
  * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
34
+ * @property {boolean} [compatibilityMode=false] - Whether the backend should be in compatibility mode or not.
34
35
  * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
35
36
  * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
36
37
  * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
@@ -63,9 +64,17 @@ class WebGPUBackend extends Backend {
63
64
 
64
65
  // some parameters require default values other than "undefined"
65
66
  this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha;
67
+ this.parameters.compatibilityMode = ( parameters.compatibilityMode === undefined ) ? false : parameters.compatibilityMode;
66
68
 
67
69
  this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
68
70
 
71
+ /**
72
+ * Indicates whether the backend is in compatibility mode or not.
73
+ * @type {boolean}
74
+ * @default false
75
+ */
76
+ this.compatibilityMode = this.parameters.compatibilityMode;
77
+
69
78
  /**
70
79
  * A reference to the device.
71
80
  *
@@ -168,7 +177,8 @@ class WebGPUBackend extends Backend {
168
177
  if ( parameters.device === undefined ) {
169
178
 
170
179
  const adapterOptions = {
171
- powerPreference: parameters.powerPreference
180
+ powerPreference: parameters.powerPreference,
181
+ featureLevel: parameters.compatibilityMode ? 'compatibility' : undefined
172
182
  };
173
183
 
174
184
  const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null;
@@ -342,6 +352,20 @@ class WebGPUBackend extends Backend {
342
352
 
343
353
  }
344
354
 
355
+ /**
356
+ * Internal to determine if the current render target is a render target array with depth 2D array texture.
357
+ *
358
+ * @param {RenderContext} renderContext - The render context.
359
+ * @return {boolean} Whether the render target is a render target array with depth 2D array texture.
360
+ *
361
+ * @private
362
+ */
363
+ _isRenderCameraDepthArray( renderContext ) {
364
+
365
+ return renderContext.depthTexture && renderContext.depthTexture.image.depth > 1 && renderContext.camera.isArrayCamera;
366
+
367
+ }
368
+
345
369
  /**
346
370
  * Returns the render pass descriptor for the given render context.
347
371
  *
@@ -397,6 +421,8 @@ class WebGPUBackend extends Backend {
397
421
 
398
422
  let sliceIndex;
399
423
 
424
+ const isRenderCameraDepthArray = this._isRenderCameraDepthArray( renderContext );
425
+
400
426
  for ( let i = 0; i < textures.length; i ++ ) {
401
427
 
402
428
  const textureData = this.get( textures[ i ] );
@@ -418,34 +444,62 @@ class WebGPUBackend extends Backend {
418
444
  viewDescriptor.dimension = GPUTextureViewDimension.ThreeD;
419
445
  viewDescriptor.depthOrArrayLayers = textures[ i ].image.depth;
420
446
 
421
- } else if ( renderTarget.isRenderTargetArray ) {
447
+ } else if ( renderTarget.isRenderTarget && textures[ i ].image.depth > 1 ) {
422
448
 
423
- viewDescriptor.dimension = GPUTextureViewDimension.TwoDArray;
424
- viewDescriptor.depthOrArrayLayers = textures[ i ].image.depth;
449
+ if ( isRenderCameraDepthArray === true ) {
450
+
451
+ const cameras = renderContext.camera.cameras;
452
+ for ( let layer = 0; layer < cameras.length; layer ++ ) {
453
+
454
+ const layerViewDescriptor = {
455
+ ...viewDescriptor,
456
+ baseArrayLayer: layer,
457
+ arrayLayerCount: 1,
458
+ dimension: GPUTextureViewDimension.TwoD
459
+ };
460
+ const textureView = textureData.texture.createView( layerViewDescriptor );
461
+ textureViews.push( {
462
+ view: textureView,
463
+ resolveTarget: undefined,
464
+ depthSlice: undefined
465
+ } );
466
+
467
+ }
468
+
469
+ } else {
470
+
471
+ viewDescriptor.dimension = GPUTextureViewDimension.TwoDArray;
472
+ viewDescriptor.depthOrArrayLayers = textures[ i ].image.depth;
473
+
474
+ }
425
475
 
426
476
  }
427
477
 
428
- const textureView = textureData.texture.createView( viewDescriptor );
478
+ if ( isRenderCameraDepthArray !== true ) {
429
479
 
430
- let view, resolveTarget;
480
+ const textureView = textureData.texture.createView( viewDescriptor );
431
481
 
432
- if ( textureData.msaaTexture !== undefined ) {
482
+ let view, resolveTarget;
433
483
 
434
- view = textureData.msaaTexture.createView();
435
- resolveTarget = textureView;
484
+ if ( textureData.msaaTexture !== undefined ) {
436
485
 
437
- } else {
486
+ view = textureData.msaaTexture.createView();
487
+ resolveTarget = textureView;
438
488
 
439
- view = textureView;
440
- resolveTarget = undefined;
489
+ } else {
441
490
 
442
- }
491
+ view = textureView;
492
+ resolveTarget = undefined;
493
+
494
+ }
443
495
 
444
- textureViews.push( {
445
- view,
446
- resolveTarget,
447
- depthSlice: sliceIndex
448
- } );
496
+ textureViews.push( {
497
+ view,
498
+ resolveTarget,
499
+ depthSlice: sliceIndex
500
+ } );
501
+
502
+ }
449
503
 
450
504
  }
451
505
 
@@ -454,7 +508,16 @@ class WebGPUBackend extends Backend {
454
508
  if ( renderContext.depth ) {
455
509
 
456
510
  const depthTextureData = this.get( renderContext.depthTexture );
457
- descriptorBase.depthStencilView = depthTextureData.texture.createView();
511
+ const options = {};
512
+ if ( renderContext.depthTexture.isArrayTexture ) {
513
+
514
+ options.dimension = GPUTextureViewDimension.TwoD;
515
+ options.arrayLayerCount = 1;
516
+ options.baseArrayLayer = renderContext.activeCubeFace;
517
+
518
+ }
519
+
520
+ descriptorBase.depthStencilView = depthTextureData.texture.createView( options );
458
521
 
459
522
  }
460
523
 
@@ -576,15 +639,15 @@ class WebGPUBackend extends Backend {
576
639
 
577
640
  colorAttachment.clearValue = i === 0 ? renderContext.clearColorValue : { r: 0, g: 0, b: 0, a: 1 };
578
641
  colorAttachment.loadOp = GPULoadOp.Clear;
579
- colorAttachment.storeOp = GPUStoreOp.Store;
580
642
 
581
643
  } else {
582
644
 
583
645
  colorAttachment.loadOp = GPULoadOp.Load;
584
- colorAttachment.storeOp = GPUStoreOp.Store;
585
646
 
586
647
  }
587
648
 
649
+ colorAttachment.storeOp = GPUStoreOp.Store;
650
+
588
651
  }
589
652
 
590
653
  } else {
@@ -595,15 +658,15 @@ class WebGPUBackend extends Backend {
595
658
 
596
659
  colorAttachment.clearValue = renderContext.clearColorValue;
597
660
  colorAttachment.loadOp = GPULoadOp.Clear;
598
- colorAttachment.storeOp = GPUStoreOp.Store;
599
661
 
600
662
  } else {
601
663
 
602
664
  colorAttachment.loadOp = GPULoadOp.Load;
603
- colorAttachment.storeOp = GPUStoreOp.Store;
604
665
 
605
666
  }
606
667
 
668
+ colorAttachment.storeOp = GPUStoreOp.Store;
669
+
607
670
  }
608
671
 
609
672
  //
@@ -614,60 +677,235 @@ class WebGPUBackend extends Backend {
614
677
 
615
678
  depthStencilAttachment.depthClearValue = renderContext.clearDepthValue;
616
679
  depthStencilAttachment.depthLoadOp = GPULoadOp.Clear;
617
- depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;
618
680
 
619
681
  } else {
620
682
 
621
683
  depthStencilAttachment.depthLoadOp = GPULoadOp.Load;
622
- depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;
623
684
 
624
685
  }
625
686
 
687
+ depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;
688
+
626
689
  }
627
690
 
628
691
  if ( renderContext.stencil ) {
629
692
 
630
- if ( renderContext.clearStencil ) {
693
+ if ( renderContext.clearStencil ) {
631
694
 
632
695
  depthStencilAttachment.stencilClearValue = renderContext.clearStencilValue;
633
696
  depthStencilAttachment.stencilLoadOp = GPULoadOp.Clear;
634
- depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;
635
697
 
636
698
  } else {
637
699
 
638
700
  depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
639
- depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;
640
701
 
641
702
  }
642
703
 
704
+ depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;
705
+
643
706
  }
644
707
 
645
708
  //
646
709
 
647
710
  const encoder = device.createCommandEncoder( { label: 'renderContext_' + renderContext.id } );
648
- const currentPass = encoder.beginRenderPass( descriptor );
711
+
712
+ // shadow arrays - prepare bundle encoders for each camera in an array camera
713
+
714
+ if ( this._isRenderCameraDepthArray( renderContext ) === true ) {
715
+
716
+ const cameras = renderContext.camera.cameras;
717
+
718
+ if ( ! renderContextData.layerDescriptors || renderContextData.layerDescriptors.length !== cameras.length ) {
719
+
720
+ this._createDepthLayerDescriptors( renderContext, renderContextData, descriptor, cameras );
721
+
722
+ } else {
723
+
724
+ this._updateDepthLayerDescriptors( renderContext, renderContextData, cameras );
725
+
726
+ }
727
+
728
+ // Create bundle encoders for each layer
729
+ renderContextData.bundleEncoders = [];
730
+ renderContextData.bundleSets = [];
731
+
732
+ // Create separate bundle encoders for each camera in the array
733
+ for ( let i = 0; i < cameras.length; i ++ ) {
734
+
735
+ const bundleEncoder = this.pipelineUtils.createBundleEncoder(
736
+ renderContext,
737
+ 'renderBundleArrayCamera_' + i
738
+ );
739
+
740
+ // Initialize state tracking for this bundle
741
+ const bundleSets = {
742
+ attributes: {},
743
+ bindingGroups: [],
744
+ pipeline: null,
745
+ index: null
746
+ };
747
+
748
+ renderContextData.bundleEncoders.push( bundleEncoder );
749
+ renderContextData.bundleSets.push( bundleSets );
750
+
751
+ }
752
+
753
+ // We'll complete the bundles in finishRender
754
+ renderContextData.currentPass = null;
755
+
756
+ } else {
757
+
758
+ const currentPass = encoder.beginRenderPass( descriptor );
759
+ renderContextData.currentPass = currentPass;
760
+
761
+ if ( renderContext.viewport ) {
762
+
763
+ this.updateViewport( renderContext );
764
+
765
+ }
766
+
767
+ if ( renderContext.scissor ) {
768
+
769
+ const { x, y, width, height } = renderContext.scissorValue;
770
+ currentPass.setScissorRect( x, y, width, height );
771
+
772
+ }
773
+
774
+ }
649
775
 
650
776
  //
651
777
 
652
778
  renderContextData.descriptor = descriptor;
653
779
  renderContextData.encoder = encoder;
654
- renderContextData.currentPass = currentPass;
655
780
  renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };
656
781
  renderContextData.renderBundles = [];
657
782
 
658
- //
783
+ }
784
+
785
+ /**
786
+ * This method creates layer descriptors for each camera in an array camera
787
+ * to prepare for rendering to a depth array texture.
788
+ *
789
+ * @param {RenderContext} renderContext - The render context.
790
+ * @param {Object} renderContextData - The render context data.
791
+ * @param {Object} descriptor - The render pass descriptor.
792
+ * @param {ArrayCamera} cameras - The array camera.
793
+ *
794
+ * @private
795
+ */
796
+ _createDepthLayerDescriptors( renderContext, renderContextData, descriptor, cameras ) {
797
+
798
+ const depthStencilAttachment = descriptor.depthStencilAttachment;
799
+ renderContextData.layerDescriptors = [];
659
800
 
660
- if ( renderContext.viewport ) {
801
+ const depthTextureData = this.get( renderContext.depthTexture );
802
+ if ( ! depthTextureData.viewCache ) {
661
803
 
662
- this.updateViewport( renderContext );
804
+ depthTextureData.viewCache = [];
663
805
 
664
806
  }
665
807
 
666
- if ( renderContext.scissor ) {
808
+ for ( let i = 0; i < cameras.length; i ++ ) {
809
+
810
+ const layerDescriptor = {
811
+ ...descriptor,
812
+ colorAttachments: [ {
813
+ ...descriptor.colorAttachments[ 0 ],
814
+ view: descriptor.colorAttachments[ i ].view
815
+ } ]
816
+ };
817
+
818
+ if ( descriptor.depthStencilAttachment ) {
819
+
820
+ const layerIndex = i;
667
821
 
668
- const { x, y, width, height } = renderContext.scissorValue;
822
+ if ( ! depthTextureData.viewCache[ layerIndex ] ) {
669
823
 
670
- currentPass.setScissorRect( x, y, width, height );
824
+ depthTextureData.viewCache[ layerIndex ] = depthTextureData.texture.createView( {
825
+ dimension: GPUTextureViewDimension.TwoD,
826
+ baseArrayLayer: i,
827
+ arrayLayerCount: 1
828
+ } );
829
+
830
+ }
831
+
832
+ layerDescriptor.depthStencilAttachment = {
833
+ view: depthTextureData.viewCache[ layerIndex ],
834
+ depthLoadOp: depthStencilAttachment.depthLoadOp || GPULoadOp.Clear,
835
+ depthStoreOp: depthStencilAttachment.depthStoreOp || GPUStoreOp.Store,
836
+ depthClearValue: depthStencilAttachment.depthClearValue || 1.0
837
+ };
838
+
839
+ if ( renderContext.stencil ) {
840
+
841
+ layerDescriptor.depthStencilAttachment.stencilLoadOp = depthStencilAttachment.stencilLoadOp;
842
+ layerDescriptor.depthStencilAttachment.stencilStoreOp = depthStencilAttachment.stencilStoreOp;
843
+ layerDescriptor.depthStencilAttachment.stencilClearValue = depthStencilAttachment.stencilClearValue;
844
+
845
+ }
846
+
847
+ } else {
848
+
849
+ layerDescriptor.depthStencilAttachment = { ...depthStencilAttachment };
850
+
851
+ }
852
+
853
+ renderContextData.layerDescriptors.push( layerDescriptor );
854
+
855
+ }
856
+
857
+ }
858
+
859
+ /**
860
+ * This method updates the layer descriptors for each camera in an array camera
861
+ * to prepare for rendering to a depth array texture.
862
+ *
863
+ * @param {RenderContext} renderContext - The render context.
864
+ * @param {Object} renderContextData - The render context data.
865
+ * @param {ArrayCamera} cameras - The array camera.
866
+ *
867
+ */
868
+ _updateDepthLayerDescriptors( renderContext, renderContextData, cameras ) {
869
+
870
+ for ( let i = 0; i < cameras.length; i ++ ) {
871
+
872
+ const layerDescriptor = renderContextData.layerDescriptors[ i ];
873
+
874
+ if ( layerDescriptor.depthStencilAttachment ) {
875
+
876
+ const depthAttachment = layerDescriptor.depthStencilAttachment;
877
+
878
+ if ( renderContext.depth ) {
879
+
880
+ if ( renderContext.clearDepth ) {
881
+
882
+ depthAttachment.depthClearValue = renderContext.clearDepthValue;
883
+ depthAttachment.depthLoadOp = GPULoadOp.Clear;
884
+
885
+ } else {
886
+
887
+ depthAttachment.depthLoadOp = GPULoadOp.Load;
888
+
889
+ }
890
+
891
+ }
892
+
893
+ if ( renderContext.stencil ) {
894
+
895
+ if ( renderContext.clearStencil ) {
896
+
897
+ depthAttachment.stencilClearValue = renderContext.clearStencilValue;
898
+ depthAttachment.stencilLoadOp = GPULoadOp.Clear;
899
+
900
+ } else {
901
+
902
+ depthAttachment.stencilLoadOp = GPULoadOp.Load;
903
+
904
+ }
905
+
906
+ }
907
+
908
+ }
671
909
 
672
910
  }
673
911
 
@@ -696,7 +934,55 @@ class WebGPUBackend extends Backend {
696
934
 
697
935
  }
698
936
 
699
- renderContextData.currentPass.end();
937
+ // shadow arrays - Execute bundles for each layer
938
+
939
+ const encoder = renderContextData.encoder;
940
+
941
+ if ( this._isRenderCameraDepthArray( renderContext ) === true ) {
942
+
943
+ const bundles = [];
944
+
945
+ for ( let i = 0; i < renderContextData.bundleEncoders.length; i ++ ) {
946
+
947
+ const bundleEncoder = renderContextData.bundleEncoders[ i ];
948
+ bundles.push( bundleEncoder.finish() );
949
+
950
+ }
951
+
952
+ for ( let i = 0; i < renderContextData.layerDescriptors.length; i ++ ) {
953
+
954
+ if ( i < bundles.length ) {
955
+
956
+ const layerDescriptor = renderContextData.layerDescriptors[ i ];
957
+ const renderPass = encoder.beginRenderPass( layerDescriptor );
958
+
959
+ if ( renderContext.viewport ) {
960
+
961
+ const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
962
+ renderPass.setViewport( x, y, width, height, minDepth, maxDepth );
963
+
964
+ }
965
+
966
+ if ( renderContext.scissor ) {
967
+
968
+ const { x, y, width, height } = renderContext.scissorValue;
969
+ renderPass.setScissorRect( x, y, width, height );
970
+
971
+ }
972
+
973
+ renderPass.executeBundles( [ bundles[ i ] ] );
974
+
975
+ renderPass.end();
976
+
977
+ }
978
+
979
+ }
980
+
981
+ } else if ( renderContextData.currentPass ) {
982
+
983
+ renderContextData.currentPass.end();
984
+
985
+ }
700
986
 
701
987
  if ( occlusionQueryCount > 0 ) {
702
988
 
@@ -1040,7 +1326,8 @@ class WebGPUBackend extends Backend {
1040
1326
  // pipeline
1041
1327
 
1042
1328
  const pipelineGPU = this.get( pipeline ).pipeline;
1043
- passEncoderGPU.setPipeline( pipelineGPU );
1329
+
1330
+ this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
1044
1331
 
1045
1332
  // bind groups
1046
1333
 
@@ -1123,123 +1410,89 @@ class WebGPUBackend extends Backend {
1123
1410
  const bindings = renderObject.getBindings();
1124
1411
  const renderContextData = this.get( context );
1125
1412
  const pipelineGPU = this.get( pipeline ).pipeline;
1126
- const currentSets = renderContextData.currentSets;
1127
- const passEncoderGPU = renderContextData.currentPass;
1128
1413
 
1129
- const drawParams = renderObject.getDrawParameters();
1414
+ const index = renderObject.getIndex();
1415
+ const hasIndex = ( index !== null );
1416
+
1130
1417
 
1418
+ const drawParams = renderObject.getDrawParameters();
1131
1419
  if ( drawParams === null ) return;
1132
1420
 
1133
1421
  // pipeline
1134
1422
 
1135
- if ( currentSets.pipeline !== pipelineGPU ) {
1136
-
1137
- passEncoderGPU.setPipeline( pipelineGPU );
1423
+ const setPipelineAndBindings = ( passEncoderGPU, currentSets ) => {
1138
1424
 
1425
+ // pipeline
1426
+ this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
1139
1427
  currentSets.pipeline = pipelineGPU;
1140
1428
 
1141
- }
1142
-
1143
- // bind groups
1144
-
1145
- const currentBindingGroups = currentSets.bindingGroups;
1146
-
1147
- for ( let i = 0, l = bindings.length; i < l; i ++ ) {
1148
-
1149
- const bindGroup = bindings[ i ];
1150
- const bindingsData = this.get( bindGroup );
1151
-
1152
- if ( currentBindingGroups[ bindGroup.index ] !== bindGroup.id ) {
1429
+ // bind groups
1430
+ const currentBindingGroups = currentSets.bindingGroups;
1431
+ for ( let i = 0, l = bindings.length; i < l; i ++ ) {
1153
1432
 
1154
- passEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group );
1155
- currentBindingGroups[ bindGroup.index ] = bindGroup.id;
1156
-
1157
- }
1158
-
1159
- }
1433
+ const bindGroup = bindings[ i ];
1434
+ const bindingsData = this.get( bindGroup );
1435
+ if ( currentBindingGroups[ bindGroup.index ] !== bindGroup.id ) {
1160
1436
 
1161
- // attributes
1437
+ passEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group );
1438
+ currentBindingGroups[ bindGroup.index ] = bindGroup.id;
1162
1439
 
1163
- const index = renderObject.getIndex();
1164
-
1165
- const hasIndex = ( index !== null );
1166
-
1167
- // index
1168
-
1169
- if ( hasIndex === true ) {
1170
-
1171
- if ( currentSets.index !== index ) {
1172
-
1173
- const buffer = this.get( index ).buffer;
1174
- const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
1175
-
1176
- passEncoderGPU.setIndexBuffer( buffer, indexFormat );
1177
-
1178
- currentSets.index = index;
1440
+ }
1179
1441
 
1180
1442
  }
1181
1443
 
1182
- }
1444
+ // attributes
1183
1445
 
1184
- // vertex buffers
1446
+ // index
1185
1447
 
1186
- const vertexBuffers = renderObject.getVertexBuffers();
1448
+ if ( hasIndex === true ) {
1187
1449
 
1188
- for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {
1450
+ if ( currentSets.index !== index ) {
1189
1451
 
1190
- const vertexBuffer = vertexBuffers[ i ];
1452
+ const buffer = this.get( index ).buffer;
1453
+ const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
1191
1454
 
1192
- if ( currentSets.attributes[ i ] !== vertexBuffer ) {
1455
+ passEncoderGPU.setIndexBuffer( buffer, indexFormat );
1193
1456
 
1194
- const buffer = this.get( vertexBuffer ).buffer;
1195
- passEncoderGPU.setVertexBuffer( i, buffer );
1457
+ currentSets.index = index;
1196
1458
 
1197
- currentSets.attributes[ i ] = vertexBuffer;
1459
+ }
1198
1460
 
1199
1461
  }
1462
+ // vertex buffers
1200
1463
 
1201
- }
1202
-
1203
- // occlusion queries - handle multiple consecutive draw calls for an object
1464
+ const vertexBuffers = renderObject.getVertexBuffers();
1204
1465
 
1205
- if ( renderContextData.occlusionQuerySet !== undefined ) {
1466
+ for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {
1206
1467
 
1207
- const lastObject = renderContextData.lastOcclusionObject;
1468
+ const vertexBuffer = vertexBuffers[ i ];
1208
1469
 
1209
- if ( lastObject !== object ) {
1470
+ if ( currentSets.attributes[ i ] !== vertexBuffer ) {
1210
1471
 
1211
- if ( lastObject !== null && lastObject.occlusionTest === true ) {
1472
+ const buffer = this.get( vertexBuffer ).buffer;
1473
+ passEncoderGPU.setVertexBuffer( i, buffer );
1212
1474
 
1213
- passEncoderGPU.endOcclusionQuery();
1214
- renderContextData.occlusionQueryIndex ++;
1475
+ currentSets.attributes[ i ] = vertexBuffer;
1215
1476
 
1216
1477
  }
1217
1478
 
1218
- if ( object.occlusionTest === true ) {
1219
-
1220
- passEncoderGPU.beginOcclusionQuery( renderContextData.occlusionQueryIndex );
1221
- renderContextData.occlusionQueryObjects[ renderContextData.occlusionQueryIndex ] = object;
1222
-
1223
- }
1224
-
1225
- renderContextData.lastOcclusionObject = object;
1226
-
1227
1479
  }
1480
+ // stencil
1228
1481
 
1229
- }
1482
+ if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {
1230
1483
 
1231
- // stencil
1484
+ passEncoderGPU.setStencilReference( material.stencilRef );
1485
+ renderContextData.currentStencilRef = material.stencilRef;
1232
1486
 
1233
- if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {
1487
+ }
1234
1488
 
1235
- passEncoderGPU.setStencilReference( material.stencilRef );
1236
- renderContextData.currentStencilRef = material.stencilRef;
1237
1489
 
1238
- }
1490
+ };
1239
1491
 
1240
- // draw
1492
+ // Define draw function
1493
+ const draw = ( passEncoderGPU, currentSets ) => {
1241
1494
 
1242
- const draw = () => {
1495
+ setPipelineAndBindings( passEncoderGPU, currentSets );
1243
1496
 
1244
1497
  if ( object.isBatchedMesh === true ) {
1245
1498
 
@@ -1355,18 +1608,45 @@ class WebGPUBackend extends Backend {
1355
1608
 
1356
1609
  const vp = subCamera.viewport;
1357
1610
 
1358
- passEncoderGPU.setViewport(
1359
- Math.floor( vp.x * pixelRatio ),
1360
- Math.floor( vp.y * pixelRatio ),
1361
- Math.floor( vp.width * pixelRatio ),
1362
- Math.floor( vp.height * pixelRatio ),
1363
- context.viewportValue.minDepth,
1364
- context.viewportValue.maxDepth
1365
- );
1366
1611
 
1367
- passEncoderGPU.setBindGroup( cameraIndex.index, cameraData.indexesGPU[ i ] );
1368
1612
 
1369
- draw();
1613
+ let pass = renderContextData.currentPass;
1614
+ let sets = renderContextData.currentSets;
1615
+ if ( renderContextData.bundleEncoders ) {
1616
+
1617
+ const bundleEncoder = renderContextData.bundleEncoders[ i ];
1618
+ const bundleSets = renderContextData.bundleSets[ i ];
1619
+ pass = bundleEncoder;
1620
+ sets = bundleSets;
1621
+
1622
+ }
1623
+
1624
+
1625
+
1626
+ if ( vp ) {
1627
+
1628
+ pass.setViewport(
1629
+ Math.floor( vp.x * pixelRatio ),
1630
+ Math.floor( vp.y * pixelRatio ),
1631
+ Math.floor( vp.width * pixelRatio ),
1632
+ Math.floor( vp.height * pixelRatio ),
1633
+ context.viewportValue.minDepth,
1634
+ context.viewportValue.maxDepth
1635
+ );
1636
+
1637
+ }
1638
+
1639
+
1640
+ // Set camera index binding for this layer
1641
+ if ( cameraIndex && cameraData.indexesGPU ) {
1642
+
1643
+ pass.setBindGroup( cameraIndex.index, cameraData.indexesGPU[ i ] );
1644
+ sets.bindingGroups[ cameraIndex.index ] = cameraIndex.id;
1645
+
1646
+ }
1647
+
1648
+ draw( pass, sets );
1649
+
1370
1650
 
1371
1651
  }
1372
1652
 
@@ -1374,7 +1654,38 @@ class WebGPUBackend extends Backend {
1374
1654
 
1375
1655
  } else {
1376
1656
 
1377
- draw();
1657
+ // Regular single camera rendering
1658
+ if ( renderContextData.currentPass ) {
1659
+
1660
+ // Handle occlusion queries
1661
+ if ( renderContextData.occlusionQuerySet !== undefined ) {
1662
+
1663
+ const lastObject = renderContextData.lastOcclusionObject;
1664
+ if ( lastObject !== object ) {
1665
+
1666
+ if ( lastObject !== null && lastObject.occlusionTest === true ) {
1667
+
1668
+ renderContextData.currentPass.endOcclusionQuery();
1669
+ renderContextData.occlusionQueryIndex ++;
1670
+
1671
+ }
1672
+
1673
+ if ( object.occlusionTest === true ) {
1674
+
1675
+ renderContextData.currentPass.beginOcclusionQuery( renderContextData.occlusionQueryIndex );
1676
+ renderContextData.occlusionQueryObjects[ renderContextData.occlusionQueryIndex ] = object;
1677
+
1678
+ }
1679
+
1680
+ renderContextData.lastOcclusionObject = object;
1681
+
1682
+ }
1683
+
1684
+ }
1685
+
1686
+ draw( renderContextData.currentPass, renderContextData.currentSets );
1687
+
1688
+ }
1378
1689
 
1379
1690
  }
1380
1691
 
@@ -1781,7 +2092,15 @@ class WebGPUBackend extends Backend {
1781
2092
  */
1782
2093
  createIndexAttribute( attribute ) {
1783
2094
 
1784
- this.attributeUtils.createAttribute( attribute, GPUBufferUsage.INDEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST );
2095
+ let usage = GPUBufferUsage.INDEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST;
2096
+
2097
+ if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) {
2098
+
2099
+ usage |= GPUBufferUsage.STORAGE;
2100
+
2101
+ }
2102
+
2103
+ this.attributeUtils.createAttribute( attribute, usage );
1785
2104
 
1786
2105
  }
1787
2106
 
@@ -2045,8 +2364,6 @@ class WebGPUBackend extends Backend {
2045
2364
  ]
2046
2365
  );
2047
2366
 
2048
- if ( texture.generateMipmaps ) this.textureUtils.generateMipmaps( texture );
2049
-
2050
2367
  if ( renderContextData.currentPass ) {
2051
2368
 
2052
2369
  const { descriptor } = renderContextData;
@@ -2083,6 +2400,12 @@ class WebGPUBackend extends Backend {
2083
2400
 
2084
2401
  }
2085
2402
 
2403
+ if ( texture.generateMipmaps ) {
2404
+
2405
+ this.textureUtils.generateMipmaps( texture );
2406
+
2407
+ }
2408
+
2086
2409
  }
2087
2410
 
2088
2411
  }